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