Java GC 调试手记
摘要
本文记录GC调试的一次实验过程和结果。
GC知识要点回顾
在32核处理器的系统上,10%的GC时间导致75%的吞吐量损失。所以在大型系统上,调试GC是以小博大的不错选择。'small improvements in reducing such a bottleneck can produce large gains in performance.'
- 选择合适的GC Collector
- 整个JVM Heap堆的大小
- Young Generation的大小(-Xmn?m or -XX:NewRatio=?)
GC shortname | Generation | Command line parameter | Comment |
---|---|---|---|
Copy |
Young |
|
The Copying collector |
MarkSweepCompact |
Tenured |
|
The Mark and Sweep Compactor |
ConcurrentMarkSweep |
Tenured |
|
The Concurrent Mark and Sweep Compactor |
ParNew |
Young |
|
The parallel Young Generation Collector — can only be used with the Concurrent mark and sweep compactor. |
PS Scavenge |
Young |
|
The parallel object scavenger |
PS MarkSweep |
Tenured |
|
The parallel mark and sweep collector |
- Serial 单线程
- Parallel 多线程并行, GC线程和App线程取一运行,即GC要Stop the (app) world。
- Concurrent 多线程并发,GC线程和App线程可同时运行。(注: Young generation 没有CMS,取而代之的是可和CMS(Old)一起运行的ParNew)
- CATALINA_OPTS="$CATALINA_OPTS -verbose:gc -Xloggc:/usr/local/tomcat/gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
- CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
- vi jstatd.all.policy
- grant codebase "file:${java.home}/../lib/tools.jar" {
- permission java.security.AllPermission;
- };
- jstatd -J-Djava.security.policy=jstatd.all.policy
visualgc 102592@remote.domain
测试
|
|
- 使用用Jmeter压力测试
- 共6个client,每个client启动30个线程发送请求
- 每个请求从16种测试样例中随机挑选一个,发送到server端
- 测试持续10min
- server使用默认GC(PS Scavenge和PS MarkSweep)
- server使用CMS(-XX:+UseConcMarkSweepGC-XX:+UseParNewGC)
- server使用CMS(-XX:+UseConcMarkSweepGC -XX:+UseParNewGC),设置Young generation的大小为200m(-Xmn200m)
- server使用CMS(-XX:+UseConcMarkSweepGC -XX:+UseParNewGC),设置Young generation的大小为600m(-Xmn600m)
- Jmeter请求的summary report
- server端累积GC时间和次数
- Expect longer young GC times
- Due to slower allocations into the old gen
- Expect better worst-case latencies
- CMS does its work mostly-concurrently
- Shorter worst-case pauses
- Expect lower throughput
- CMS does more work
结论
如果你喜欢本文, 请长按二维码,关注公众号 分布式编程.
作者:分布式编程
出处:https://zthinker.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。