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部分回收,减少用户线程的停顿时间。