JVM常用参数
JVM常用参数
X
或者 XX
开头的都是非标准化参数:意思就是说标准化参数不会变,非标准化参数可能在每个JDK版本中有所变
化,但是就目前来看 X
开头的非标准化的参数改变的也是非常少。
格式:-XX:[+-]<name>
表示启用或者禁用 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的Xms
和Xmx
要设置成一样的,限定堆内存的总大小,能够避免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之后再次进行"Stopthe 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,而此时各个区域的内存占用情况都比较正常。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!