JVM三种垃圾收集算法
2022-05-26 17:34:04 0 举报
图解JVM三种垃圾收集算法,优点、缺点、工作机制
作者其他创作
大纲/内容
担保机制:如果Eden+Survivor中存活的对象另一块Survivor空间装不下。此时老年代就是担保人,大后方!放不下的会进入老年代
标记清除
回收后示意图:
移动对象的过程中,会stop the world
标记复制(主要针对新生代)
表示标记为待回收对象
表示存活对象
回收后,空间碎片化。导致后续为较大对象分配内存时找不到足够的连续空间,而提前触发下一次垃圾收集
A
Eden
将存活的对象复制到另一半堆空间(对象紧挨着存放,不会有空间碎片)
概述:
S
回收前示意图:
缺点:
将堆空间分为两半(1:1),每次使用其中一半。
C
先标记出存活对象(或者回收对象),然后清除
回收后
用于分配内存
标记整理(针对老年代)
同样进行标记
将使用的一半空间全部回收
B
为什么老年代不使用标记复制?因为标记复制需要担保人,新生代的担保人是老年代。但是老年代使用复制的话,如果超出空间,就没人担保了。
大多数Java虚拟机采用这种方式回收新生代
如果堆中包含大量对象,需要进行大量的标记和清除动作
对象朝生夕灭:IBM公司研究表明,新生代中有98%的对象熬不过第一轮收集,所以不需要按照1:1来划分新生代。于是就有了经典的Appel式回收。把新生代划分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和一块Survivor空间。它们的比例就是经典的8:1:1了
同样先进行标记,然后把存活的对象移动到内存空间的一端。然后清除边界以外的空间
因为老年代的对象特点就是不容易“死亡”,所以每次回收都会有很多的存活对象。这种情况下使用标记清除会导致碎片化,使用标记整理会“暂停”。虽然使用标记清除不会stop the world,但是使用标记整理系统吞吐量会高。所以老年代使用标记整理
发生GC时,将Eden和Survivor中存活的对象复制到另一块未使用的Survivor空间,然后直接清理Eden和使用的那块Survivor所使用的空间
浪费了堆空间的一半
收藏
0 条评论
下一页