JVM如何判断对象是否可以被回收
一.引用计数法
给对象添加一个引用计数器,对象被引用一次,计数器就加1,不再引用计数器减1,如果一个对象的引用计数器为0,就是说这个对象不会被使用,判定为可以回收。
引用计数器原理简单,效率高,但是占用了额外的内存空间计数,无法解决对象之间的相互引用问题。
二.可达性分析算法
首先确定肯定不能被回收的对象Gc Root,从这些GC Root出发,找到所有直接和间接引用的对象。如果一个对象没有被GC Root直接或者间接引用,判定这个对象可以被回收。
可达性分析包括根节点枚举和查找引用链两个步骤。
根节点(GC Root)枚举:
所有在Java线程当前活跃栈帧里的指向堆里的对象的引用。
在方法区中类静态属性的引用。
方法区中常量的引用。
本地方法栈中的引用。
所有被同步锁(synchronized)持有的对象的引用。
四种引用,强软弱虚
强引用:垃圾回收永远不会回收强引用对象。
软引用:在内存不足时,会回收软引用对象。
弱引用:只要发生了垃圾回收,就会回收弱引用对象。
虚引用:未知。
下一篇:
【算法打卡03】移除链表元素