jvm 垃圾收集器
*******************************************************************************
新生代垃圾收集器
Serial:垃圾回收时使用一条垃圾回收线程,用户线程停止运行
虚拟机运行在clinent模式下默认的新生代收集器
ParNew:垃圾回收时可以有多条垃圾回收线程,用户线程停止运行
相关参数:
-XX:UseParNewGC:使用该参数强制指定使用ParNew垃圾收集器
-XX:UseConcMarkSweepGC:老年代使用CMS收集器时,新生代默认使用ParNew收集器
Parallel Scanvenge:吞吐量优先的垃圾收集器,垃圾回收时,多条垃圾回收线程同时工作
吞吐量:用户线程运行时间/(用户线程运行时间+垃圾回收线程运行时间)
相关参数:
-XX:MaxGCPauseMillis:设置最大垃圾回收时间
-XX:GCTimeRatio:设置吞吐量,默认为99,及最大允许1/(1+99)=1%的垃圾回收时间
-XX:UseAdaptiveSizePolicy:自适应的调节策略,设置好MaxGCPauseMillis或者GCTimeRatio后,垃圾收集器会自动调节其余参数
***********************************************************************************
老年代收集器
Serial Old:垃圾回收是只有一条垃圾回收线程,用户线程停止
可作为使用CMS垃圾收集器Concurrent Mode failue时使用
Parallel Old:Parallel Scavenge对应的老年代收集器
在注重吞吐量的场合,可以使用Parallel Scavenge 加Parallel Old的组合
CMS:并发收集器,垃圾回收是可以和用户线程一起工作
运行步骤:
初始标记:枚举根节点
并发标记:根据根节点追踪,标记可回收对象
重新标记:修改并发标记阶段引用关系发生变化的对象
并发清除:清除可回收对象
特点:使用标记清除算法,会产生浮动垃圾,若垃圾回收后没有足够的内存,则会出现Concurrent Mode failure,会启用Serial Old垃圾收集器进行垃圾回收;此外,使用标记清除算法,也会产生空间碎片,可使用参数-XX:CMSFullGCsBeforeCompaction设置执行多少次不压缩的full gc后,使用带压缩的full gc(默认每次full gc都会使用compaction)
注意:CMS在java9中已经不推荐使用,未来可能要移除
Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
G1:并发收集器,垃圾回收线程可以和用户线程一起运行
特点:
保留分代概念,将堆内存划分为多个region,垃圾回收范围发生在整个堆内存;
整体使用标记整理算法、局部标记复制算法,不会产生内存碎片;
维护优先级队列,优先回收回收价值较大的region(回收价值考虑回收内存空间与回收时间)
使用remember set记录region之间对象的引用关系
运行步骤
初始标记:枚举根节点
并发标记:根据根节点追踪可回收对象
最终标记:标记并发标记阶段引用关系发生变化的对象
筛选回收:筛选回收价值较大的region