哪些情况下的对象会被垃圾回收机制处理掉?
前言
看见即降服,这句话说的是一件事物,只要你看得到,你就能得到。
对我来说记录就是看见。
面试题不只是为了面试,更是为了帮助我们更深入地理解我们已知的知识。
分析
对于本文这个问题,我觉得我们得先了解一下JVM的内存模型(这个专业术语的大白话就是JVM在程序运行时所创建的内存区域有哪些),这样我们才清楚我们创建的对象都在哪里;再者我们还需要知道垃圾回收机制会回收哪些内存区域的对象。
jvm的内存区域
先来看下面两张图。
图一:
图二:
从上面两张图大家应该看到了JVM的内存模型,一共五个内存区域。上面的图有点模糊哈,这里有彩色图(文末参考链接中的):
所以希望大家支持正版,这样学习的时候不会对知识有模糊认识。
下面简单解释一下五个区域都是放什么东西的(具体解释查看文末参考链接哈):
方法区
存储已被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后的代码等数据。
堆
存放对象实例。
虚拟机栈(或称java虚拟机栈)
线程私有的,用来存放栈帧,而栈帧里面是用来存储局部变量表,操作数栈,动态链接,方法返回地址等信息。
本地方法栈
线程私有,本地方法栈和java虚拟机栈非常类似,他们之间唯一的差别就是java虚拟机栈是为了java程序中的方法也就是字节码的方法服务的,而本地方法栈是给Native方法服务的。
程序计数器
线程私有的,如果线程正在执行一个java方法,那么这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法(本地方法)那么这个计数器值为空。
小结
好了,我们现在已经知道了我们创建的对象实例都在堆里面。
垃圾回收机制
小结
我们现在已经知道了垃圾回收机制的原理和算法,以及回收区域是堆。
哪些情况下的对象会被垃圾回收机制处理掉?
通过上面的分析,有两种情况:
1.根据java的四种对象引用方式,如果符合回收条件就会被垃圾回收机制处理掉。
2.如果对象实例没有被其他任何对象引用的情况下会被垃圾回收机制处理掉。
网上说的还有一个情况是:所有实例都没有活动线程访问。 这个我不是很理解,可能说的是,程序处于不活跃状态的时候,系统又需要内存资源时,垃圾回收机制回把这些实例对象处理掉?(有清楚的大佬可以在评论区指点一下,蟹蟹)。
参考
转载自:https://juejin.cn/post/6885245001023488013