jvm垃圾回收

一、各jdk版本默认垃圾收集器

jdk1.7和1.8默认垃圾收集器为-XX:+UseParallelGC:Parallel Scavenge(新生代)+Parallel Old(老年代)

jdk1.9默认为G1收集器

二、垃圾回收算法

标记-清除:1、标记阶段:从GC Roots(栈和方法区里的对象:局部变量、常量等)开始,标记可达对象;2、清除阶段:清除不可达对象(会造成大量的空间碎片)

复制算法:将eden和幸存区可达对象,复制到另一个幸存区,然后清除eden和幸存区(适合年轻代,少量对象存活);

标记-整理:标记阶段也是从root开始标记可达;压缩阶段:将可达对象压缩至内存的一端,清理边界外的所有空间(适合老年代,存活对象较多)。

三、CMS和G1比较

1、初始标记:都暂停用户线程,标记和GC Roots直接关联的对象;

2、并发标记:都可以和用户线程并发执行,从GC Roots开始标记整个堆可达对象;

3、最终标记:都必须暂停用户线程,标记“并发标记”阶段有变化的部分对象;

4、回收:CMS和用户线程并发执行;G1默认暂停用户线程,G1内存是分成N个大小相等的Region,对各个Region的回收成本和价值进行排序,根据用户的期望时间来制定回收计划,回收部分Region。

三、垃圾收集器:从串行到并行,再到部分阶段和用户线程并发执行,再分Region部分回收,减少用户线程的停顿时间

jvm垃圾回收

 

https://crowhawk.github.io/2017/08/15/jvm_3/