0110-JVM运行时参数
作者:互联网
文章目录
1. JVM参数选项类型
1. 类型一:标准参数选项
特点
- 比较稳定,后续版本基本不会变化
- 以-开头
选项
运行java或者java -help可以看到所有的标准选项
补充内容
-server与-client
2. 类型二:-X参数选项
特点
- 非标准化参数
- 功能还是比较稳定的,但官方说后续版本可能会变更
- 以-X开头
选项
运行java -X命令可以看到所有的X选项
JVM的JIT编译模式相关的选项
- -Xint 禁用JIT,所有字节码都被解释执行,这个模式速度最慢
- -Xcomp 所有字节码第一次使用就被编译成本地代码,然后再执行
- -Xmixed 混合模式,默认模式,让JIT根据程序运行的情况,有选择地进行编译
特别地
- -Xms 设置初始java堆大小,等价于-XX:InitialHeapSize
- -Xmx 设置最大java堆大小,等价于-XX:MaxHeapSize
- -Xss 设置java线程对堆栈大小,等价于-XX:ThreadStackSize
3. 类型三:-XX参数选项
特点
- 非标准化参数
- 使用的最多的参数类型
- 这类选项属于实验性,不稳定
- 以-XX开头
作用
用于开发和调试JVM
分类
-
Boolean类型格式
- -XX:+表示启用属性
- -XX:-表示禁用属性
- 说明:因为有的指令默认时开启的,所以可以使用-关闭
-
非Boolean类型格式(key-value类型)
- 类型1:数值型格式:-XX:=
- 类型2:非数值型格式:-XX:=
特别地
- -XX:+printFlagFinal
- 输出所有参数的名称和类型值
- 默认不包括Diagnostic和xperimenta的参数
- 可以配合-XX:+UnlockDiagnosticVmOptions和-XX:-UnlockDiagnosticVmOptions使用
2. 添加JVM参数选项
1. 运行jar包
java -Xms50m -Xmx50m -XX:+PrintGCDetails =XX:+PrintGCTimeStamps -jar demo.jar
2. 通过Tomcat运行war包
- linux
linux在catalina.sh文件中添加 JAVA_OPTS="-Xms512m -Xmx512m"
- windows
window在catalina.bat文件中添加 JAVA_OPTS="-Xms512m -Xmx512m"
3. 常用的JVM参数选项
1. 打印设置的XX选项及值
- -XX:+PrintCommandLineFlags
可以让在程序前打印出用户手动设置或者jvm自动设置的XX选项 - -XX:+PrintFlagsInitial 表示打印出所有XX选项的默认值
- -XX:+PrintFlagFinal 表示打印出XX选项在运行程序时生效的值
- -XX:+PrintVMOptions 打印JVM参数
2. 堆、栈、方法区等内存大小设置
栈
- -Xss128k
- 设置每个线程的栈大小为128k
- 等价于-XX:ThreadStackSize=128k
堆内存
- -Xms3550m 等价于-XX:InitialHeapSize,设置JVM初始堆内存3550m
- -Xmx3550m 等价于-XX:HeapMaxSize,设置JVM最大堆内存为3550m
- -Xmn2g
- 设置年轻代大小为2G,表示年轻代最大值和最小值都是2G,等价于-XX:NewSize=2g -XX:MaxNewSize=2g
- 官方推荐配置为整个堆大小的3/8
- -XX:NewSize=1024m 设置年轻代初始值为1024M
- -XX:MaxNewSize=1024m 设置年轻代最大值为1024M
- -XX:SurvivorRatio=8 设置年轻代中Eden区与一个Survivor区的比值,默认为8
- -XX:+UseAdaptiveSizePolicy 自动Eden区和Survivor区的大小,默认开启,建议打开
- -XX:NewRatio=4 设置老年代与年轻代(一个Eden和2个Survivor)的比值,默认是2,老年代:年轻代 = 2:1
- -XX:PretenureSizeThreadshold=1024
- 设置让大于此阈值的对象直接分配在老年代,单位为字节
- 只对Serial、ParNew收集器有效
- -XX:MaxTenuringThread=15
- 默认值为15
- 新生代每次Minor GC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代
- -XX:+PrintTenuringDistribution 让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布
- -XX:TargetSurvivorRatio 表示MinorGC结束后Survivor区域中占用空间的期望比例
方法区
- 永久代
- -XX:PermSize=256m 设置永久代初始值256m
- -XX:MaxPermSize=256m 设置永久代最大值256m
- 元空间
- -XX:MetaspaceSize 初始空间大小
- -XX:MaxMetaspaceSize 最大空间,默认没有限制
- -XX:+UseCompressdOops 压缩对象指针
- -XX:+UseCompressedClassPointers 压缩类指针
- -XX:CompressClassSpaceSize 设置Class Metaspace的大小,默认1G
直接内存
-XX:MaxDirectMemorySize 指定DirectMemory容量,若未指定,则默认与java堆最大值一样
3. OutofMemory相关的选项
- -XX:+HeapDumpOnOutOfMemoryError 表示在内存出现OOM的时候,把Heap转存(Dump)到文件以便后续分析
- -XX:+HeapDumpBeforeFullGC 表示在出现FullGC之前,生成Heap转储文件
- -XX:HeapDumpPath=
指定heap转存文件路径 - -XX:OnOutOfMemoryError=<脚本路径> 指定一个可行性程序或者脚本路径,当发生OOM的时候,去执行这个脚本
4. 垃圾收集器相关的选项
查看默认垃圾收集器
- -XX:+PrintCommandLineFlags 查看命令行相关参数
- jinfo -flag 相关垃圾回收器参数 进程ID
Serial回收器
- 新生代垃圾回收器
- -XX:+UseSerialGC
ParNew回收器
- 年轻代垃圾回收器
- -XX:+UseParNewGC
- -XX:ParallelGCThreads=N 并行线程数
Parallel回收器
- -XX:+UseParallelGC 指定年轻代Parallel并行收集器
- -XX:+UseParallelOldGC 指定老年代并行搜集器, 与上面互相激活
- -XX:ParallelGCThreads 设置年轻代并行搜集器的线程数,一般与CPU核心数相等
- -XX:MaxGCPauseMillis 设置垃圾收集器最大停顿时间(STW时间)值越小,用户体验越好,服务器能收集的垃圾越有限
- -XX:GCTimeRatio 垃圾收集时间的比例(1 / (N+1)) ,用于衡量吞吐量的大小, 默认99,表示垃圾回收时间不超过1%
- -XX:+UseAdaptiveSizePolicy 设置Parallel Scavenge 搜集器自适应调节,年轻代中Eden和Survivor区的比例,晋升老年代的年龄都会自适应调节
CMS回收器
- 老年代垃圾回收器
- -XX:+UseConcMarkSweepGC (ParNew + CMS + Serial Old组合)
- -XX:CMSInitiaingOccupanyFraction 设置堆使用率的阈值,达到这个阈值,开始进行回收;jdk6以后 默认92%,表示老年代空间使用达到92%时,开始回收,因为cms是并行,如果在回收之前老年代满了,则使用Serial Old回收器
- -XX:CMSFullGCsBeforeCompaction 设置在执行多少次Full GC后对内存进行压缩整理
- -XX:ParallelCMSThreads 设置CMS的线程数量
- -XX:ConcGCThreads 设置并发垃圾收集的线程数
G1回收器
- -XX:+UseG1GC 手动指定使用G1回收器
- -XX:G1HeapRegionSize 每个region的大小,值是2的幂,方位1mb到32mb之间,默认是堆的1/2000
- -XX:MaxGCPauseMillis 最大GC停顿时间指标,默认200ms
- -XX:ParallelGCThread 设置STW时GC线程数的值,最多是8
- -XX:ConcGCThreads 并发标记的线程数
- -XX:InitiatingHeapOccupancyPercent 触发GC周期的Java堆占用率阈值,超过此值,就触发GC,默认45
- -XX:G1NewSizePercent、-XX:G1MaxNewSizePercent 新生代占用整堆内存的最小百分比和最大百分比
- -XX:G1ReservePersent=10 保留内存区域,防止to space(Survivor中的to区)溢出
怎样选择垃圾回收器
- 优先调整堆的大小让JVM自适应完成
- 如果内存小于100M,使用串行回收器
- 如果是单核、单机程序,并且没有停顿时间的要求,串行搜集器
- 如果是多CPU、需要高吞吐量、允许停顿时间超过1s,选择并行或者JVM自己选择
- 如果多CPU、追求低停顿时间、需快速响应(延迟不能超过1s,互联网运用),使用并发搜集器,推荐G1,现在互联网应用,基本都是G1
5. GC日志相关选项
常用参数
- -verbose:gc 输出gc日志信息,默认输出到标准输出
- -XX:+PrintGC 等同于-verbose:gc 表示打开简化的GC日志
- -XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,并在进程退出时输出当前内存各区域分配情况
- -XX:+PrintGCTimeStamps 输出GC发生时的时间戳,时间是从程序执行到现在的时间
- -XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息
- -Xloggc: 把GC日志写入到一个文件中去,而不是打印到标准输出中
- -XX:+PrintGCDateStamps 输出GC的日期时间戳
标签:选项,0110,设置,XX,参数,JVM,GC 来源: https://blog.csdn.net/wrongyao/article/details/115497956