JVM常用参数

JVM常用参数

X 或者 XX 开头的都是非标准化参数:意思就是说标准化参数不会变,非标准化参数可能在每个JDK版本中有所变

化,但是就目前来看 X 开头的非标准化的参数改变的也是非常少。

格式:-XX:[+-] 表示启用或者禁用 name 属性。

例子:-XX:+UseG1GC 表示启用 G1 垃圾收集器。

1、堆栈配置相关

# 示例
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:PermSize=16m -XX:MaxPermSize=16m -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=0 -jar App.jar
  • -Xmx3550m:设置最大堆大小为3550m

  • -Xms3550m:设置初始堆大小为3550m

  • -Xss128k:设置每个线程的堆栈大小为128k

  • -Xmn2g:设置年轻代大小为2g

  • -XX:PermSize:设置初始永久代大小为16m

  • -XX:MaxPermSize:设置最大持久代大小为16m。JDK 1.8 以后取消了该参数,改为了元数据空间:

    -XX:MaxMetaspaceSize

  • -XX:MetaspaceSize: 设置元空间大小。

  • -XX:NewSize=n :设置年轻代大小。

  • -XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。

    -XX:NewRatio=4表示年轻代与年老代比值为1:4,那么年轻代将占据堆内存的1/5,老年代将占据堆内存

    4/5,默认新生代和老年代的比例为1:2

  • -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值,设置为 4,那么 Survivor 区的大小

    将是 Eden 区大小的1/4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的

    1/6

  • -XX:MaxTenuringThreshold=0:设置垃圾最大年龄,如果设置为0的话,则年轻代对象不经过Survivor区,

    直接进入年老代。默认15岁,用来指定对象具体多少岁可以进入老年代。

  • -XX:PretenureSizeThreshold: 设置垃圾最大字节数,将值设置为字节数,比如1048576字节,就是

    1MB。意思就是如果你要创建一个大于这个大小的对象,那就直接把这个大对象放到老年代里去。

  • -XX:-HandlePromotionfailure :设置之后会先判断老年代的平均空间是否能够放下 MinorGC 之后的对象

    大小,否则直接Full GC ,JDK1.6 之后废弃掉了,默认判断老年代空间大于新生代所有对象之和,或者大于

    Minor GC升入老年代的对象的平均大小。

在生产环境中,JVM的XmsXmx要设置成一样的,限定堆内存的总大小,能够避免GC在调整堆大小带来的不必

要的压力。

2、垃圾收集器相关

  • -XX:+UseParNewGC:加入这个选项,JVM启动之后对新生代进行垃圾回收,就是ParNew垃圾回收器了。默

    认给自己设置的垃圾回收线程的数量就是跟CPU的核数是一样的。

  • -XX:+UseParallelGC:选择垃圾收集器为并行收集器。

  • -XX:ParallelGCThreads: 配置并行收集器的线程数,并行收集线程数,建议一般不要随意动这个参数。

  • -XX:MaxGCPauseMillis:设置并行收集最大暂停时间。

  • -XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比,公式为1/(1+n)。

  • -XX:+CMSIncrementalMode:设置为增量模式,适用于单CPU情况。

  • -XX:+UseParalledlOldGC:设置并行年老代收集器。

  • -XX:+UseConcMarkSweepGC:设置并发收集器。

  • -XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以

    后会产生"碎片",使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。

  • -XX:CMSInitiatingOccupancyFraction:设置老年代占用多少比例的时候触发CMS垃圾回收,JDK1.6里面

    的默认值是92%。

  • -XX:+UseCMSInitiatingOccupancyOnly: 与上边参数配合,只用上边设定的值,否则会动态调整。

  • -XX:+UseCMSCompactAtFullCollection: CMS的参数默认就打开的,意思是在Full GC之后再次进行"Stop

    the World",停止工作线程,然后进行碎片整理,就是把存活对象都挪到一起,空出来大片连续内存空间,避

    免内存碎片。打开对年老代的压缩,可能会影响性能,但是可以消除碎片。

  • -XX:CMSFullGCsBeforeCompation: 设置经过多少次Full GC之后进行一次内存碎片整理。

  • -XX:+UseG1GC: 指定使用G1垃圾回收器,此时会自动使用堆大小除以2048确定Region的大小。

  • -XX:G1HeapRegionSize: 手动指定Region的大小。

  • -XX:G1NewSizePercent: 设置新生代初始占比,其实维持这个默认值即可,默认值5% 。新生代最多不会

    超过60%,也可以通过下边参数设置-XX:G1MaxNewSizePercent

  • -XX:MaxGCPauseMills :设定GC停顿时间,默认值是200ms 也就是G1执行GC的时候可以让系统停顿多长

    时间。

  • -XX:InitiatingHeapOccupancyPercent: 默认值45% G1参数,如果老年代占据了堆内存45%的时候,就

    会触发新生代+老年代一起回收的混合回收阶段。

  • -XX:G1MixedGCCountTarget: G1参数,在一次混合回收过程中,最后一个阶段执行几次混合回收,默认值

    是8次。

  • -XX:G1HeapWastePercent: 默认值5% 在混合回收的时候,对Region的回收都是基于复制算法,将Region

    中的存活对象复制到其它Region,然后把这个Region的垃圾全部清理掉,一旦空出来的Region达到堆内存的

    5%,就立即停止混合回收。

  • -XX:G1MixedGCLiveThresholdPercent:默认值85%,意思是确定要回收的Region的时候,必须是存活对

    象低于85%的对象才可以回收。

3、辅助信息相关

  • -XX:+PrintGC:开启垃圾收集(GC)的打印输出,JVM 会在控制台输出垃圾收集的相关信息,包括 GC 的时

    间、频率、消耗的内存等。

  • -XX:+PrintGCDetails:打印详细的GC日志。

  • -XX:+PrintGCTimeStamps:打印出来每次GC的时间。

  • -Xloggc:filename:GC日志输出到文件里filename,比如:-Xloggc:/gc.log

4、异常发生相关

  • -XX:+PrintCommandLineFlags:查看当前JVM设置过的相关参数。

Dump 异常快照:

  • -XX:+HeapDumpOnOutOfMemoryError:用于在发生 OutOfMemoryError 时自动生成堆转储(Heap Dump)文

    件。

  • -XX:HeapDumpPath:用于指定堆转储文件的存储位置。

堆内存出现 OOM 的概率是所有内存耗尽异常中最高的,出错时的堆内信息对解决问题非常有帮助,所以给JVM设

置这个参数(-XX:+HeapDumpOnOutOfMemoryError),让JVM遇到OOM异常时能输出堆内信息,并通过

(-XX:+HeapDumpPath)参数设置堆内存溢出快照输出的文件地址,这对于特别是对相隔数月才出现的OOM异常尤

为重要。

# 示例
-Xms10M -Xmx10M -Xmn2M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\study\log_hprof\gc.hprof
  • -XX:OnOutOfMemoryError:表示发生OOM后,用于指定当发生 OutOfMemoryError 时要执行的命令。利

    用这个参数,我们可以在系统OOM后,自定义一个脚本,可以用来发送邮件告警信息,可以用来重启系统等

    等。

# 示例
-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_151\bin\jconsole.exe"

表示发生OOM后,运行jconsole.exe程序,这里可以不用加"",因为jconsole.exe路径Program Files含有空格。

5、优化Full GC性能参数

  • -XX:+CMSParallelInitialMarkEnabled :在cms垃圾回收器的初始标记阶段开启多线程并发执行,可以减

    少"stop the world"的时间。

  • -XX:+CMSScavengeBeforeRemark: 在cms重新标记之前,先尽量执行一次YouongGC,先回收掉一些对

    象,在重新标记阶段就能少扫描一些对象,提升重新标记阶段的性能。

  • -XX:TraceClassLoading -XX:TraceClassUnloading追踪类加载和类卸载的情况,他会通过日志打印出来

    jvm中加载了哪些类,卸载了哪些类。

  • -XX:SoftRefLRUPolicyMSPerMB=0: 这个参数设置大一些即可,千万别让一些新手同学设置为0,可以设置

    个1000,2000,3000,或者5000毫秒,都可以。影响jvm自动创建的一些软引用对象的回收问题。

  • -XX:+DisableExplicitGC: 禁止显示执行GC,不允许你通过代码来执行GC 。即调用System.gc(),平时开

    发的时候也不要随便使用System.gc()去随便触发GC 。否则有可能压力过大的情况下导致每秒钟都会触发Full

    GC,而此时各个区域的内存占用情况都比较正常。

你可能感兴趣的:(java,java)