JM垃圾回收的时候如何确定垃圾?是否知道什么是 GC Roots
什么是垃圾: 简单的说, 内存中已经不再被使用的空间,就是垃圾.
例如一个对象指向为null了 Person p1 = null , 那么就可以将p1对象进行回收.
要进行垃圾回收, 怎么判断一个对象是否可以被回收?
- 引用计数法 (了解)
Java中,引用和对象是有关联的。如果要操作对象则必须用引用进行
因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,给对象中添加一个引用计数器,
每当有一个地方引用它,计数器值加1
每当有一个引用失效时,计数器值减1。
任何时刻计数器值为零的对象就是不可能再被使用的,那么这个对象就是可回收对象
那为什么主流的Java虚拟机里面都没有选用这种算法呢?其中最主要的原因是它很难解决对象之间相互循环引用的问题
2,枚举根节点做可达性分析(根搜索路径)
把GC Root对象开始作为起点, 来进行链路的扫描和访问, 如果能够可达就认为是活跃的,就不能回收,如果不能访问到, 那就不可达, 链条的起点必须是GCRoot对象,
如下图左图为引用可达对象, 因为是从GCRoots开始的. 而右图为GC不可达, 因为不是从GCRoot开始的, 即使它内部的object5关联着object6和7.
- 可以成为GCRoot的对象
1.虚拟机栈(栈帧中的局部变量区,也叫局部变量表)中引用的对象
2.方法区中静态类属性引用的对象(使用static修饰的对象)
3.方法区常量引用的对象.(使用final修饰的对象)
4.本地方法栈中JNI(Native方法)引用的对象. (使用Native修饰的方法, 线程中用的多.)