阅读文本大概需要3分钟。
要执行垃圾回收(GC),需要先判断对象是否还被引用,用通俗的话讲,就是需要判断对象是否还存在引用,那么如何判断呢?判断对象状态的算法有哪些呢?
0x01:引用计数算法
顾名思义,通过判断对象是否还被引用,来判定是否可以进行回收。当对象被引用则将引用次数+1,当不再引用则-1,引用次数为0,则代表没有对象引用。当对象没有被引用时,则可能被GC回收。这种算法的优点是:高效。缺点是:循环引用的情况无法有效回收(所谓循环引用:也就是A引用B,同时B也引用A),所以当前主流判断对象是否还被引用,并不采用该算法。
0x02:可达性分析算法
从GC Root的根开始向下搜索,当遇到对象与Root之间无关联时,则标记为可以被回收。那么什么样的对象可以作为Root呢?
下面是基于以上两种常见的GC算法:
标记—清除算法:所谓标记-清除算法,就是进行遍历,筛选出可以回收的对象,做标记。这种算法的主要缺点是,标记清除之后,会产生很多碎片化的空间。
复制算法:如何避免出现很多碎片化的空间呢,于是出现了复制算法,将内存空间一分为二,每次只使用一半的空间,当使用完毕,则将还存活的对象复制到另外一半上面。这种算法的缺点是,每次内存的利用率只有一半。当然,如果对象的存活率很高,复制效率也会相对比较低。
标记—整理算法:考虑到对象存活率高,复制算法效率会比较低,可以采用标记-整理算法,将不再引用的对象进行移动移动整理到某个边界位置,然后将边界外的对象进行统一清理。
分代收集算法:当前主流的JVM大都采用分代收集算法,也就是说根据不同的区域,使用不同的算法。例如新生代,存活率比较低,可以采用复制算法;老年代,存活率很高,可以采用标记-清除或者标记-整理算法。
☆
往期精彩
☆
关注我每天进步一点点
你点的在看,我都当成了喜欢