zhouxihua0 2020-03-24
垃圾回收机制
概念:四种引用类型
a.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用他的时候就加1,当有引用失效的时候就减1;任何时刻计数器为0的对象是不能被使用的
(但是因为他不能解决相互循环引用问题,所以没有被主流JVM所使用)
b.可达性分析法:以【GC ROOT】对象作为起始点,从这个节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC ROOT没人任何引用链时,则 这个对象是不可用的。
可以作为GC ROOT的对象
需要注意的是:在可达性分析法中被判定不可达对象未必真的就判死刑了,至少要经历两次标记过程,判断对象是否有必要执行finalize(),若判定有必要的话,还会在进行一次筛选,在finalize()中如果该对象与引用链中的任何一个对象建立关系,则它将被移除"即将回收"的集合 |
2.垃圾收集算法(介绍JVM怎么回收掉这些对象)
a.分代收集算法(是当前商业虚拟机都采用的一种算法)
b.复制算法
有研究表明新生代中的对象98%是朝生夕死的,因此没必要按照1:1来划分内存空间,而是分为一块较大的Eden空间和两块较小的Survivor空间, 在HotSpot虚拟机中默认比例为8:1:1。每次使用Eden和一块Survivor,回收时将这两块中存活着的对象一次性地复制到另外一块Survivor上,再做清理。可见只有10%的内存会被“浪费”,倘若Survivor空间不足还需要依赖其他内存(老年代)进行分配担保。 |
c.标记清除法:首先标记需要被回收的对象,然后统一清除这些对象
缺点:标记、清除效率不高;空间碎片太多,会产生大量不连续的空间碎片,可能会导致在后面需要分配较大对象时,因为无法找到连续较大的空间而提前 触发另一次GC,影响性能。
d.标记-整理算法:首先『标记』出所有需要回收的对象,然后进行『整理』,使得存活的对象都向一端移动,最后直接清理掉端边界以外的内存。
优点:即没有浪费50%的空间,又不存在空间碎片问题,性价比较高。
一般情况下,老年代会选择标记-整理算法。