Jvm GC Options
🔗General options
-
-XX:+PrintFlagsFinal
-
-XX:+PrintFlagsInitial
-
-XX:+PrintCommandLineFlags
-
-XX:+UnlockExperimentalVMOptions
-
-XX:+UnlockDiagnosticVMOptions
-
-XX:+ParallelRefProcEnabled
java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal
java -client -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal
🔗GC
See following image first:
🔗Young generation
- "Serial" 是串行收集器,也是
-client
默认的GC收集器,可以-XX:+UseSerialGC
来强制开启 - "ParNew" 是并行收集齐,也是
-server
默认的GC收集器,可以-XX:+UseParallelGC
来强制开启 - "Parallel Scavenge" 是吞吐量优先收集器,可以通过
-XX:+UseParallelGC
来强制开启
🔗Old generation
- "CMS" 是 Concurrent Mark Sweep 收集器
执行阶段:
- CMS-initial-mark
- CMS-concurrent-mark
- CMS-concurrent-preclean
- CMS-remark
- CMS-concurrent-sweep
- CMS-concurrent-reset
相关参数:
-XX:+UseConcMarkSweepGC
-XX:CMSFullGCsBeforeCompaction=n
-XX:ParallelGCThreads=n
-XX:+ConcGCThreads=n
-
"Serail Old" 是串行收集器
-
"Parallel Old" 是并行收集器,可以通过
-XX:+UseParallelOldGC
来手动开启
🔗Flags
-XX:+UseSerialGC
: 相当于"Serial" + "SerialOld",这个方案直观上就应该是性能最差的-XX:+UseParallelGC
: 相当于"Parallel Scavenge" + "SerialOld",也就是说,在young generation中是多线程处理,但是在tenured generation中则是单线程-XX:+UseParallelOldGC
: 相当于 "Parallel Scavenge" + "ParallelOld",都是多线程并行处理-XX:+UseConcMarkSweepGC
: 相当于"ParNew" + "CMS" + "Serial Old",即在 Young Generation 中采用 "ParNew",多线程处理;在 Tenured Generation 中使用"CMS",以求得到最低的暂停时间,但是,采用CMS有可能出现 "Concurrent Mode Failure" ,如果出现了,就只能采用 "SerialOld" 模式了
🔗Latency
For some GC collectors:
-XX:MaxGCPauseMillis=10000
-XX:MaxGCMinorPauseMillis=100
🔗throughput
For some GC collectors:
-XX:GCTimeRatio=2