Java 8应用young gc时间过长,平均耗时接近100ms,偶尔能到1.5s

Java 8应用young gc时间过长,平均耗时接近100ms,偶尔能到1.5s
使用垃圾收集器parNew + CMS,几乎没有触发过CMS gc
使用框架spring + mybatis + dubbo + rocketmq
JVM参数:
-server -Xmx5g -Xms5g -Xmn1g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -Xss256k -XX:SurvivorRatio=8 -XX:+PrintGCDetails -Xloggc:/opt/apps/logs/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+PrintReferenceGC -XX:+UnlockDiagnosticVMOptions -XX:-DisplayVMOutput -XX:+LogVMOutput -XX:LogFile=/opt/apps/logs/safepoint.log -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/apps/logs

问题找到了,是容器的原因。
背景信息没补充完全,应用是跑在docker里的,jstack看了下,新生代的gc线程有54条,但是容器给的配置只有6核,所以可以确认JVM拿错了CPU的核心数,拿到的是物理机的核心数。增加了参数-XX:ParallelGCThreads=6 -XX:ConcGCThreads=6,现在的新生代收集时间基本稳定在50ms以内。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章