微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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区)溢出

怎样选择垃圾回收器

  1. 优先调整堆的大小让JVM自适应完成
  2. 如果内存小于100M,使用串行回收器
  3. 如果是单核、单机程序,并且没有停顿时间的要求,串行搜集器
  4. 如果是多cpu、需要高吞吐量、允许停顿时间超过1s,选择并行或者JVM自己选择
  5. 如果多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的日期时间戳

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐