JVM判断对象回收有两种方式:引用记数、GC Roots,引用记数比较简单,JVM为每个对象维护一个引用计数,假设A对象引用计数为零说明没有任务对象引用A对象,那A对象就可以被回收了,但是引用计数有个缺点就是无法解决循环引用的问题。
GC Roots通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象是不可用的。
在Java中,可以作为GC Roots的对象包括下面几种:
- 虚拟机栈中引用的对象;
- 方法区中类静态属性引用的对象;
- 方法区中的常量引用的对象;
- 本地方法栈中JNI(即一般说的Native方法)的引用的对象;
小结
总的来说就是当一个对象通过GC Roots搜索不到时,说明对象可以被回收了,但什么时候回收还要看GC的心情!
转载:石杉,只是为了记录、整理方便后面的温故。