首页 > 技术文章 > JVM参数之RocketMQ

qiusheng0755 2022-05-24 08:03 原文

JDK 1.8 Hotspot 虚拟机参数说明
https://ld246.com/article/1552491323380

HeapDump性能社区
https://heapdump.cn/topics

查看当前JVM的垃圾收集器
java -XX:+PrintCommandLineFlags -version

如果使用的CMS GC算法,建议JVM Heap不要太大,在4GB以内就可以。JVM太大,导致Major GC或者Full GC产生的“stop the world”时间过长

runserver.sh

JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8  -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib:${JAVA_HOME}/lib/ext"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

-server 指定JVM Server模式。
-Xms4g -Xmx4g -Xmn2g 初始堆4g, 堆最大4g, 年轻代2g。
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m 元空间初始值,元空间最大值,元空间存在操作系统内存中,可以垃圾回收。JDK8的元空间几乎可用完机器的所有内存。
-XX:+UseConcMarkSweepGC: 使用ParNew + CMS + Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。
-XX:+UseCMSCompactAtFullCollection: CMS“标记-清除”算法收集后,会产生大量碎片,用于在Full GC之后增加一个碎片整理过程。
-XX:CMSInitiatingOccupancyFraction=70: 在默认设置下,CMS收集器在老年代使用了68%的空间时就会被激活。
-XX:CMSFullGCsBeforeCompaction=1: 参数设置执行多少次Full GC之后执行一次碎片整理过程。
-XX:+CMSParallelRemarkEnabled:开启并行的Remark,加快remark的速度,重新标记阶段是完全的STW的,有可能会耗时比较长。
-XX:SoftRefLRUPolicyMSPerMB=0: 每兆堆空闲空间的 soft reference 保持存活(一旦它不强可达了)的毫秒数,系统默认为1秒。软引用位于强引用和弱引用之间,StrongReference强引用 > SoftReference软引用 > WeakReference弱引用。cache系统最适合用Soft reference,当对象是Soft reference可达时,gc可能会向操作系统申请更多内存,而不是直接回收它,由JVM决定回收对象的时机。WeakReference能在对象置为null时仍能自动感知,并且主动断开引用指向的对象,经过一轮gc后,会自动回收对象内存。
-XX:+CMSClassUnloadingEnabled:对永久代进行垃圾回收,Hotspot虚拟机中永久代即方法区,只有在 UseConcMarkSweepGC 启用的情况下才有用,默认不启用。
-XX:SurvivorRatio=8: SurvivorRatio的默认值为8,言外之意就是Survivor和Edon的比例是8:1:1。
-XX:-UseParNewGC: 禁用新生代使用ParNew并行收集器。ParNew收集器是Serial收集器的多线程并行版。
-verbose:gc 表示输出虚拟机中GC的详细情况。
-Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log 设置GC日志的路径,%p记录进程pid,%t会记录当前日期。
-XX:+PrintGCDetails: 输出详细GC日志。
-XX:+UseGCLogFileRotation: 开启GC日志滚动日志。
-XX:NumberOfGCLogFiles=5: 设置GC日志的个数。
-XX:GCLogFileSize=30m: 设置GC日志文件多大时,写入下一个GC日志文件中。
-XX:-OmitStackTraceInFastThrow: 在server模式下运行的时候,默认选项是-XX:+OmitStackTraceInFastThrow,当大量抛出同样的异常,后面的异常输出将不打印堆栈。
-XX:-UseLargePages: 禁用大页面内存,通过-XX:+UseLargePages开启,或者-XX:-UseLargePages关闭。
-Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib:${JAVA_HOME}/lib/ext 指定由ExtClassLoader加载器加载的目录,覆盖默认加载的$JAVA_HOME/lib/ext目录。
-Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n 开启JVM远程调试,方便IDE远程调试。

runbroker.sh

JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib:${JAVA_HOME}/lib/ext"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

-XX:+UseG1GC:配置JVM使用G1垃圾收集器。
-XX:G1HeapRegionSize=16m:设置每个Region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分出约2048个区域。默认是堆内存的1/2000。
-XX:G1ReservePercent=25:指定G1为分配担保预留的空间比例,默认10%。也就是老年代会预留10%的空间来给新生代的对象晋升,如果经常发生新生代晋升失败而导致Full GC,那么可以适当调高此阈值。但是调高此值同时也意味着降低了老年代的实际可用空间。
-XX:InitiatingHeapOccupancyPercent=30:指定触发全局并发标记的老年代使用占比,默认值45%,也就是老年代占堆的比例超过45%。
-XX:SoftRefLRUPolicyMSPerMB=0: 每兆堆空闲空间的 soft reference 保持存活(一旦它不强可达了)的毫秒数,系统默认为1秒。软引用位于强引用和弱引用之间,StrongReference强引用 > SoftReference软引用 > WeakReference弱引用。cache系统最适合用Soft reference,当对象是Soft reference可达时,gc可能会向操作系统申请更多内存,而不是直接回收它,由JVM决定回收对象的时机。WeakReference能在对象置为null时仍能自动感知,并且主动断开引用指向的对象,经过一轮gc后,会自动回收对象内存。
-verbose:gc 表示输出虚拟机中GC的详细情况。
-Xloggc:${GC_LOG_DIR}/rmq_broker_gc_%p_%t.log 设置GC日志的路径,%p记录进程pid,%t会记录当前日期。
-XX:+PrintGCDetails: 输出详细GC日志。
-XX:+PrintGCDateStamps: 打印CG发生的时间戳,是一个阅读性好的,普通的日期时间
-XX:+PrintGCApplicationStoppedTime: 打印实际的" GC停止世界时间"。
-XX:+PrintAdaptiveSizePolicy:启动在GC日志中输出大小调整的详细信息。
-XX:-OmitStackTraceInFastThrow: 在server模式下运行的时候,默认选项是-XX:+OmitStackTraceInFastThrow,当大量抛出同样的异常,后面的异常输出将不打印堆栈。
-XX:+AlwaysPreTouch:在服务启动的时候真实的分配物理内存给JVM,而不再是虚拟内存,效果是可以加快代码运行效率,缺点是JVM进程的启动变慢。JVM的参数-Xmx和-Xms可以设置JVM的堆大小,但是此时操作系统分配的只是虚拟内存,只有JVM真正要使用该内存时,才会被分配物理内存。
-XX:MaxDirectMemorySize=15g:限制JVM使用的直接内存最大容量。如果没有设置该参数则默认值为0,意味着JVM自己自动给NIO direct-buffer allocations选择最大大小。
-XX:-UseLargePages: 禁用大页面内存,通过-XX:+UseLargePages开启,或者-XX:-UseLargePages关闭。
-XX:-UseBiasedLocking:禁用偏向锁,偏向锁在单线程环境内确实能极大降低锁消耗,但在多线程高并发环境下,线程竞争频繁,而偏向锁在释放时,为了避免出现冲突,需要等到进入全局安全点才能进行,所以每次偏向锁释放会有更大的消耗,频繁stw,造成吞吐下降。
-Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib:${JAVA_HOME}/lib/ext 指定由ExtClassLoader加载器加载的目录,覆盖默认加载的$JAVA_HOME/lib/ext目录。
-Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n 开启JVM远程调试,方便IDE远程调试。

推荐阅读