JVM-Tuning-CheatSheet
JVM 调试与优化实践清单
本文着重于介绍
调试工具
常见的调试工具会提供慢调用自动监听、全局线程比对、热点方法分析等功能。
JVM 参数配置分析
基础参数
-Xms4g
: JVM 启动时,分配的最小堆大小4G
垃圾回收参数
其他参数
Tomcat JVM 配置
CATALINA_OPTS="-server"
CATALINA_OPTS="${CATALINA_OPTS} -Xms5120m -Xmx5120m"
CATALINA_OPTS="${CATALINA_OPTS} -XX:PermSize=256m -XX:MaxPermSize=256m"
CATALINA_OPTS="${CATALINA_OPTS} -Xmn2500m"
CATALINA_OPTS="${CATALINA_OPTS} -XX:MaxDirectMemorySize=1g"
CATALINA_OPTS="${CATALINA_OPTS} -XX:SurvivorRatio=10"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5000"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.client.gcInterval=72000000"
CATALINA_OPTS="${CATALINA_OPTS} -XX:ParallelGCThreads=${CPU_COUNT}"
CATALINA_OPTS="${CATALINA_OPTS} -Xloggc:${MIDDLEWARE_LOGS}/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${MIDDLEWARE_LOGS}/java.hprof"
CATALINA_OPTS="${CATALINA_OPTS} -Djava.awt.headless=true"
CATALINA_OPTS="${CATALINA_OPTS} -Dsun.net.client.defaultConnectTimeout=10000"
CATALINA_OPTS="${CATALINA_OPTS} -Dsun.net.client.defaultReadTimeout=30000"
CATALINA_OPTS="${CATALINA_OPTS} -DJM.LOG.PATH=${MIDDLEWARE_LOGS}"
CATALINA_OPTS="${CATALINA_OPTS} -Dfile.encoding=${JAVA_FILE_ENCODING}"
CATALINA_OPTS="${CATALINA_OPTS} -Djava.awt.headless=true -Dcom.sun.management.jmxremote.port=1090"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.ssl=false"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.125.59.163"
参数 | 含义 | 扩展阅读 |
---|---|---|
-Xms4g | ||
-Xmx4g | ||
-XX:MetaspaceSize=256m | 元数据区默认大小,从 |
|
-XX:MaxMetaspaceSize=256m | 元数据的最大大小 | |
-Xmn2g | 分配的年轻代大小:2g | |
-XX:MaxDirectMemorySize=1g | 配置最大的堆外内存 | http://hellojava.info/?tag=maxdirectmemorysize |
-XX:SurvivorRatio=10 | ||
-XX:+UseConcMarkSweepGC | 使用 |
|
-XX:+UseCMSCompactAtFullCollection | 在 |
|
-XX:CMSMaxAbortablePrecleanTime=5000 | 指定 |
http://shensy.iteye.com/blog/1915227 http://www.blogjava.net/BlueDavy/archive/2009/10/09/297562.html |
-XX:+CMSClassUnloadingEnabled | 由于使用的框架是 |
|
-XX:CMSInitiatingOccupancyFraction=80 | 使用 |
|
-XX:+UseCMSInitiatingOccupancyOnly | 我们用 |
|
-XX:+ExplicitGCInvokesConcurrent | 如今 |
- |
-Dsun.rmi.dgc.server.gcInterval=2592000000 | 作为 |
https://coderanch.com/t/91073/Difference-client-gcInterval-server-gcInterval |
-Dsun.rmi.dgc.client.gcInterval=2592000000 | 作为 |
https://coderanch.com/t/91073/Difference-client-gcInterval-server-gcInterval |
-XX:ParallelGCThreads=4 | 并行收集器的线程数 | 此值最好配置与处理器数目相等 同样适用于 |
-Xloggc:/home/admin/logs/gc.log | - | |
-XX:+PrintGCDetails | 打印 |
- |
-XX:+PrintGCDateStamps | 打印 |
- |
-XX:+HeapDumpOnOutOfMemoryError | 当发生 |
- |
-XX:HeapDumpPath=/home/admin/logs/java.hprof | 内存 |
- |
-Djava.awt.headless=true | - | |
-Dsun.net.client.defaultConnectTimeout=10000 | - | |
-Dsun.net.client.defaultReadTimeout=30000 | 设置超时时间,当从 |
- |
-DJM.LOG.PATH=/home/admin/logs | 阿里中间件约定定义日志文件路径 | - |
-DJM.SNAPSHOT.PATH=/home/admin/snapshots | 容灾文件,原来和日志一个目录,现在单独指定,防止运维误删 |
- |
-Dfile.encoding=UTF-8 | 设置文件编码为 |
- |
-Dhsf.publish.delayed=true | ||
-Dproject.name=di-afi | 设置工程名,与应用名相同 | - |
-Dpandora.boot.wait=true | PandoraBootstrap.markAndWait(),标记这里是不是要等待的, | - |
-Dlog4j.defaultInitOverride=true | 检查系统属性 |
- |
-Dpandora.location=/home/admin/di-afi/target/taobao-hsf.sar | 设置潘多拉的路径 | - |
-Dapp.location=/home/admin/di-afi/target/di-afi | 设置应用的路径 | - |
-Djava.endorsed.dirs | 包升级替换机制,一般默认是 |
- |
-Djava.io.tmpdir=/home/admin/di-afi/.default/temp | 设置应用的写入的临时文件目录 | - |
内存分析
线程与调用分析
追踪
JVM 常用调试命令与工具介绍
本文着重于介绍
内存
Dump
JEP 328: Flight Recorder(JFR)是
# Time-Based
$ java -XX:StartFlightRecording=delay=20s,duration=60s,filename=C:\myRecording.jfr,settings=profile,name=SampleRecording
# Continuous With Dump on Demand
$ java -XX:StartFlightRecording=settings=default
# Continuous With Dump on Exit
$ java -XX:StartFlightRecording=settings=default -XX:FlightRecorderOptions=dumponexit=true,dumponexitpath=C:\tmp
通过
线程
网络
磁盘
追踪
Links
诊断
-
JVM 调试工具说明 >Java VisualVM >JMX:Java Management Extensions (JMX)