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