jvm 垃圾收集器
说明:ParNew已经在java10中移除,CMS在java 14开始已经移除,默认使用G1垃圾收集器
*******************************
新生代垃圾收集器
***********************
Serial:垃圾回收时使用一条垃圾回收线程,用户线程停止运行
相关参数
-XX:+UseSerialGC:使用serial + serial old进行垃圾收集
***********************
ParNew:垃圾回收时可以有多条垃圾回收线程,用户线程停止运行,java10中已经移除
相关参数:
-XX:+UseParNewGC:使用该参数强制指定使用ParNew垃圾收集器
-XX:+UseConcMarkSweepGC:老年代使用CMS收集器时,新生代默认使用ParNew收集器
注意:The option -XX:+UseParNewGC was deprecated in JDK 9 and should be removed in JDK 10
***********************
Parallel Scanvenge:吞吐量优先的垃圾收集器,垃圾回收时,多条垃圾回收线程同时工作
吞吐量:用户线程运行时间/(用户线程运行时间+垃圾回收线程运行时间)
相关参数:
-XX:+UseParallelGC:Parallel Scavenge + Parallel Old
-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的组合
相关参数
-XX:+UseParallelGC :Parallel Scavenge + Parallel Old
-XX:+UseParallelOldGC:Parallel Scavenge + Parallel Old
-XX:+UseParallelOldGC在 java 15中已经移除
#java 14
Java HotSpot(TM) 64-Bit Server VM warning: Option UseParallelOldGC was deprecated in
version 14.0 and will likely be removed in a future release.
[0.025s][info][gc,heap,coops] Heap address: 0x0000000081c00000, size: 2020 MB, Compressed
Oops mode: 32-bit
[0.026s][info][gc ] Using Parallel
#java 15
Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option UseParallelOldGC; support was
removed in 15.0
[0.031s][info][gc] Using G1
[0.034s][info][gc,init] Version: 15+36-1562 (release)
***********************
CMS:并发收集器,垃圾回收是可以和用户线程一起工作
java 14已经移除,忽略该参数,默认使用G1
Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC;
support was removed in 14.0
特点:
并发清除阶段用户线程可同时工作,有可能会产生浮动垃圾,若没有回收到足够的内存(出现Concurrent Mode failure),会启用Serial Old垃圾收集器进行垃圾回收;
使用标记清除算法会产生空间碎片,可使用参数-XX:+CMSFullGCsBeforeCompaction设置执行多少次不压缩的full gc后,使用带压缩的full gc(默认每次full gc都会使用compaction)
运行步骤:
初始标记:枚举根节点
并发标记:根据根节点追踪,标记可回收对象
重新标记:修改并发标记阶段引用关系发生变化的对象
并发清除:清除可回收对象
***********************
G1:并发收集器,垃圾回收线程可以和用户线程一起运行
特点:
保留分代概念,将堆内存划分为多个region,垃圾回收范围发生在整个堆内存;
整体使用标记整理算法、局部标记复制算法,不会产生内存碎片;
维护优先级队列,优先回收回收价值较大的region(回收价值考虑回收内存空间与回收时间)
使用remember set记录region之间对象的引用关系
运行步骤:
初始标记:枚举根节点
并发标记:根据根节点进行可达性分析,标记可回收对象
最终标记:修改并发标记阶段引用关系发生变化的对象
筛选回收:筛选回收价值较大的region