【目录】 【上一篇:JVM 监控工具】 【下一篇:分析 GC 日志】
十二、JVM 运行时参数
1、JVM 参数选项类型
1.1、标准参数选项
- 比较稳定,后续版本基本不会变化
- 以
-
开头 java -help
命令弹出来的命令
1.2、-X 参数选项
- 后续有可能变化
- 以
-X
开头 java -X
命令弹出来的命令
1.3、-XX 参数选项
Boolean类型格式:
-XX:+<option> 启用option属性
-XX:-<option> 禁用option属性
例:
-XX:-UseParallelGC: 不选择 ParallelGC 垃圾收集器
-XX:+UseG1GC: 启用 G1 收集器
非Boolean类型格式
-XX:<option>=<number> 设置option数值,可以带单位如k/K/m/M/g/G
-XX:<option>=<string> 设置option字符
例:
-XX:NewSize=1024m 设置年轻代初始值为 1024MB
-XX:MaxNewSize=1024m 设置年轻代最大内存为 1024MB
2、常用的 JVM 参数选项
2.1、打印设置的 XX 选项及值
-XX:+PrintCommandLineFlags: 可以在程序运行前打印出用户手动设置或者 JVM 自动设置的 XX 选项
-XX:+PrintFlagsInitial: 打印出所有 XX 选项的默认值
-XX:+PrintFlagsFinal: 打印出 XX 选项在运行时生效的值
-XX:+PrintVMOptions: 打印 JVM 的参数
2.2、堆、栈、方法区等内存大小设置
堆:
-Xmx1024m 等价于 -XX:InitialHeapSize,设置 JVM 初始堆内存为 1024MB
-Xmx1024m 等价于 -XX:MaxHeapSize,设置 JVM 最大堆内存为 1024MB
-Xmn2g 设置年轻代大小为 2GB, 官方推荐配置为整个堆大小的 3/8
-XX:NewSize=1024m 设置年轻代初始值为 1024MB
-XX:MaxNewSize=1024m 设置年轻代最大内存为 1024MB
-XX:SurvivorRatio=8 设置年轻代中 Eden 区 与 Survivor 区的比值,默认为 8
-XX:+UseAdaptiveSizePolicy 自动选择各区大小比例
-XX:NewRatio=4 设置老年代与年轻代的比值(默认值是 2 )
-XX:PretenureSizeThreadshold=1024 设置让大于此阈值的对象直接分配在老年代,单位为字节;(只对 Serial、ParNew收集器有效)
-XX:MaxTenuringThreshold=15 新生代晋升老年代年龄阈值
-XX:+PrintTenuringDistribution 让 JVM 每次在 MinorGC 后,打印出当前使用的 Survivor 中对象的年龄分
栈:
-Xss128k 设置每个线程栈大小为 128k
方法区:
-XX:MetaspaceSize 初始元空间大小
-XX:MaxMetaspaceSize 最大元空间大小(默认无限制)
-XX:+UseCompressedOops 压缩对象指针
-XX:+UseCompressedClassPointers 压缩类指针
-XX:CompressedClassSpaceSize 设置 Klass Metaspace 大小,默认为 1G
2.3、OutOfMemory 相关的选项
-XX:+HeapDumpOnOutOfMemoryError 表示在内存出现 OOM 的时候,生成 Dump 文件
-XX:+HeapDumpBeforeFullGC 表示在出现 FullGC 之前,生成 Dump 文件
-XX:HeapDumpPath=<path> 生成 Dump 文件的路径
-XX:OnOutOfMemoryError 指定一个可行性程序或者脚本的路径,当发生 OOM 的时候,去执行这个脚本
例如: -XX:OnOutOfMemoryError=/opt/Server/restart.sh 发生 OOM 时,服务重启
restart.sh 脚本,linux 环境
#!/bin/bash
pid=$(ps -ef|grep Server.jar|awk '{if($8=="java"){print $2}}')
kill -9 $pid
cd /opt/Server/;sh run.sh
2.4、垃圾收集器相关选项
Paralle 回收器:
-XX:+UseParallelGC 手动指定年轻代使用 Parallel 并行垃圾收集器
-XX:ParallelGCThreads 设置年轻代并行收集器的线程数, 一般的, 最好与 CPU 数量相等, 以避免过多的线程数影响垃圾收集线程.
默认情况下, 当 CPU 数量小于 8 个, ParallelGCThreads 的值等于 CPU 的数量
当 CPU 数量大于 8 个, ParallelGCThreads 的值等于 3 + [[5 * CPU_Count] / 8]
-XX:MaxGCPauseMillis 设置垃圾收集器最大停顿时间
-XX:GCTimeRatio 垃圾收集时间占总时间比例
-XX:+UseAdaptiveSizePolicy 开启 Parallel Scavenge 收集器自适应调节策略
G1 回收器:
-XX:MaxGCPauseMillis 设置期望达到最大的 GC 停顿时间, 默认值是 200ms
-XX:ParallelGCThread 设置 STW时 GC 线程数量, 最大设置为 8
-XX:ConcGCThreads 设置并发标记的线程数, 将值设置为并行垃圾回收线程数(ParallelGCThread)的 1/4 左右
-XX:InitiationHeapOccupancyPercent 设置触发并发 GC 周期的 Java 堆占用率阈值, 超过此值, 就触发 GC, 默认值是 45
-XX:G1NewSizePercent、-XX:G1MaxNewSizePercent 新生代占用整个堆内存的最小百分比(默认 5%)、最大百分比(默认 60%)
-XX:G1ReservePercent=10 保存内存区域,防止 to space(Survuvir 中的 to 区)溢出
2.5、GC 日志相关选项
常用参数:
-verbose:gc 输出 GC 日志信息, 默认输出到标准输出
-XX:+PrintGC 等同于 -verbose:gc, 表示打开简化的 GC 日志
-XX:+PrintGCDetails 在发生垃圾回收时, 输出详细的 GC 日志
-XX:+PrintGCTimeStamps 输出 GC 发生时的时间戳
-XX:+PrintGCDetaStamps 输出日期格式的时间戳
-XX:+PrintHeapAtGC 每一次 GC 前和 GC 后, 都打印堆信息
-Xloggc:<file> 把 GC 日志写入到一个文件中
其他参数:
-XX:+TraceClassLoading 监控类的加载
-XX:+PrintGCApplicationStoppedTime 打印 GC 时,线程的停顿时间
-XX:+PrintGCApplicationConcurrentTime 打印收集之前打印出应用中未中断的执行时间
-XX:+PrintReferenceGC 记录回收了多少种不同引用类型的引用
-XX:+PrintTenuringDistribution 让 JVM 在每次 MinorGC 后打印出当前使用的 Survivor 中对象的年龄分布
-XX:+UseGCLogFileRotation 启用 GC 日志文件的自动转存