什么是垃圾: 简单的说, 内存中已经不再被使用的空间,就是垃圾. 例如一个对象指向为null了 Person p1 = null , 那么就可以将p1对象进行回收.
要进行垃圾回收, 怎么判断一个对象是否可以被回收?
- 引用计数法 (了解)
- GCRoot (枚举根节点可达性分析(根搜索路径)) 把GC Root对象开始作为起点, 来进行链路的扫描和访问, 如果能够可达就认为是活跃的,就不能回收,如果不能访问到, 那就不可达, 链条的起点必须是GCRoot对象, 如下图左图为引用可达对象, 因为是从GCRoots开始的. 而有图为GC不可达, 因为不是从GCRoot开始的, 即使它内部的object5关联着object6和7.
可以成为GCRoot的对象
1.虚拟机栈(栈帧中的局部变量区,也叫局部变量表)中引用的对象 2.方法区中静态类属性引用的对象(使用static修饰的对象) 3.方法区常量引用的对象.(使用final修饰的对象) 4.本地方法栈中JNI(Native方法)引用的对象. (使用Native修饰的方法, 线程中用的多.)