目录
-XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值。
-XX:MaxMetaspaceSize=n 最大元空间大小。
一、不同开头的参数
1、- 开头为标准参数
所有的 JVM 都要实现这些参数,并且向后兼容,如 -server。
2、-D 设置系统属性,
如 -Dfile.encoding=UTF-8。
3、以 -X 开头为非标准参数
基本都是传给 JVM 的,默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容。 可以使用 java -X 命令来查看当前 JVM 支持的非标准参数,如 -Xmx8g。
4、以 –XX:开头为非稳定参数
专门用于控制 JVM 的行为,跟具体的 JVM 实现有关,随时可能会在下个版本取消。 -XX:±Flags 形式, ± 是对布尔值进行开关,如 -XX:+UseG1GC。 -XX:key=value 形式, 指定某个选项的值,如 -XX:MaxPermSize=256m。
二、常用参数分类
1、内存
-Xms<size> 初始堆大小
-Xms1024M 初始化堆内存,正常和最大堆内存相同,减少动态改变的内存损耗
-Xmx<size> 最大堆内存
-Xmx1024M 最大堆内存 一般将Xms和Xmx设为一样的值,若-Xms比较小,又需要初始化很多对象,jvm就必须反复增加内存。一样大也可避免每次垃圾回收完成后JVM重新分配内存。
-Xmn<size> 设置年轻代初始大小和最大大小。
-Xmn384M 增大年轻代后,会减小年老代大小,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 等效于: 使用 -XX:NewSize 设置初始化大小并使用-XX:MaxNewSize 设置最大大小。
-XX:NewSize=n设置年轻代最小空间大小。
-XX:NewSize=384M
-XX:MaxNewSize=n设置年轻代最大空间大小。
-XX:MaxNewSize=384M
-Xss<size> 线程的栈的大小。
-Xss256k -Xss 默认是 512k~1024k 等价于 -XX:ThreadStackSize=512k
-XX:NewRatio=n 设置年轻代和年老代的比值
-XX:NewRatio=3 表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值。
-XX:SurvivorRatio=8 年轻代比例 8:1:1
-XX:MetaspaceSize=n 元空间大小。
-XX:MetaspaceSize=256M
-XX:MaxMetaspaceSize=n 最大元空间大小。
-XX:MaxMetaspaceSize=256M
2、GC信息
-XX:+PrintGC 打印GC日志
-XX:+PrintGC
-XX:+PrintGCDetails 打印GC详细日志
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCTimeStamps GC时,打印进程启动到现在经历的时间。
GC 内容输出到文件中
-XX:+PrintGCDetails -Xloggc:/tmp/logs/gc_%p.log 将以上 GC 内容输出到文件中
3、OOM信息
OOM的时候自动dump内存快照出来
-XX:+HeapDumpOnOutOfMemoryError 开启堆转储功能。当Java应用抛出OutOfMemoryError异常时会用堆转储工具(HPROF)将Java堆存储到文件中。 可使用选项-XX:HeapDumpPath=path指定文件路径。
# OOM的时候自动dump内存快照出来 -XX:+HeapDumpOnOutOfMemoryError # 设置Dump保存的路径 -XX:HeapDumpPath=/usr/local/app/oom # 错误日志存放路径 -XX:ErrorFile=/tmp/logs/hs_error_pid%p.log
4、Full GC信息
# 在Full GC前生成dump文件 -XX:+HeapDumpBeforeFullGC # 在Full GC后生成dump文件 -XX:+HeapDumpAfterFullGC # 设置Dump保存的路径 -XX:HeapDumpPath=/tmp/FullGC
三、案例
1、案例
-Xmx1024M 最大堆内存 -Xms1024M 初始化堆内存,正常和最大堆内存相同,减少动态改变的内存损耗 -Xmn384M 年轻代内存 -XX:PermSize=128M 初始化持久代内存 -XX:MaxPermSize=256M 最大持久代内存 -XX:SurvivorRatio=8 年轻代比例 8:1:1 -XX:+PrintGCDetails 打印gc信息,可参考gc的比例进行调优 -XX:MaxDirectMemorySize=128M 比如netty的零copy会使用到直接内存,一般System.gc()会回收,但是如果DisableExplicitGC开启,会将System.gc()转为空,不会回收这部分内存,如果启用了cms,会对直接堆外内存回收 -XX:+DisableExplicitGC System.gc()不可用 -XX:+UseConcMarkSweepGC 老年代使用cms,标记-清除算法会产生碎片 -XX:+UseParNewGC 年轻代使用并行收集器 -XX:+UseCMSCompactAtFullCollection 和下面的配合使用,开启碎片整理 -XX:CMSFullGCsBeforeCompaction=10 10次fullgc后开始内存空间压缩 -XX:+CMSParallelRemarkEnabled cms收集过程初始标记、并发标记、预清理、可中断预清理、最终标记、并发清除、并发重置,在最终标记中遍历区域较多,开启并行收集。 -XX:+UseCMSInitiatingOccupancyOnly 开启,使用下面的值 -XX:CMSInitiatingOccupancyFraction=70 对内存占用70%执行cms -XX:+CMSClassUnloadingEnabled 清理持久代 -XX:+HeapDumpOnOutOfMemoryError oom会将堆信息dump -XX:HeapDumpPath=/opt/log/tomcat/10-sdk/dump/heap.hprof dump文件地址 -XX:+PrintGCDateStamps 打印gc时间 -XX:TargetSurvivorRatio=90 s区达到90%自动计算转到老年代的age -XX:MaxTenuringThreshold=15 年轻代到老年代的最大age -XX:-ReduceInitialCardMarks 解决gc bug -Dcom.sun.management.jmxremote.authenticate=true 开启用户认证 -Dcom.sun.management.jmxremote.ssl=false 禁止ssl连接 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.access.file=../shared/conf/jmxremote.access 用户名 -Dcom.sun.management.jmxremote.password.file=../shared/conf/jmxremote.password 密码 -Djava.rmi.server.hostname=xxx -Dcatalina.base=/opt/oracle/tomcat/t-10 设置tomcat目录
2、常用配置
-Xms4096M -Xmx4096M -Xmn3072M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFaction=92 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSParallelInitialMarkEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/app/oom