GC

136 阅读1分钟

java -XX:+PrintFlagsFinal -version

kill -3 打印进程堆栈

kill - 9 强制中断

kill -15 告诉进程自动中断

G1

G1最主要的设计目标:STW停顿时间和比例可预期,可配置

物理上不分区,逻辑分区

G1划分逻辑区 - 2048个Region 每个1MB

可以分为Eden区(5%-60%),存活区,老年代,大对象四种区域

每个区,垃圾占用到一定比例80%,标记为回收集,CollectionSet

垃圾最多的块优先收集

每次回收一部分垃圾(10%)

参数:MaxGcPauseMill:执行gc操作的暂停时间,默认为200毫秒,不一定做得到

巨型对象:52W长度的数组 大于region一半的对象

解决办法:调整RegionSize

吞吐量:并行

低延迟:CMS

内存较大:G1 - 16G以上G1

​ 32G以上ZGC

ZGC

ZGC JDK 11 (实验性开关) JDK 15天然支持

原理:着色指针和读屏障,几乎全部并发执行

gc时间短 不超过10ms 进一步缩短STW时间

堆大小支持广:100M-16T

吞吐量低于G1 15%

只支持linus

Epsilon实验性GC,用于分析GC情况

ShennandoahGC

实际问题

并行GC,不设置并行线程数,虚拟机有8个核

线程过度,频繁抢占核心, 切换线程,实际执行的GC线程48个,jvm拿到的是72个和 72 * 5/8 + 3 = 48

解决:显示的配置线程个数 ParallelGCThreads=8