常用的 JVM 参数

 2022-09-06
原文地址:https://blog.csdn.net/qq_43418737/article/details/125170411

jvm是java的运行环境,在jvm中有很多的参数可以进行设置,合理的设置参数可以让jvm在各种环境中都能够高效的运行,对于我们开发者而言,jvm的绝大部分参数保持默认即可,不需要我们手动的更改,但是了解jvm支持的参数及功能也对我们往后的开发至关重要。

一、前言

jvm的参数类型主要有一下三种:

  • 标准参数:jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help检索出所有的标准参数;
  • 非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
  • 非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用。

按照参数类型可以分成以下三种:

  • 布尔型参数选项:-XX:+ 打开, -XX:- 关闭;
  • 数字型参数选项通过-XX:=设定;
  • 字符行参数选项通过-XX:=设定,通常用来指定一个文件,路径,或者一个命令列表。

二、标准参数

如果需要获取标准参数详细说明,可以按照如下方法:

列出标准参数:java -help

202209062300071481.png

详细参数及作用如下:

-d32 使用32位数据模型(如果可用)
-d32 使用32位数据模型(如果可用)
-d64 使用64位数据模型(如果可用)
-server 选择"server"VM,默认VM是server.
-cp<目录和zip/jar文件的类搜索路径> -classpath <目录和zip/jar文件的类搜索路径>用;分隔的目录,JAR档案和ZIP档案列表,用于搜索类文件。     
-D<名称>=<值> 设置系统属性
-verbose:[class gc
-version 输出产品版本并退出
-version:<值> 警告:此功能已过时,将在未来发行版中删除。需要指定的版本才能运行
-showversion 输出产品版本并继续
-jre-restrict-search -no-jre-restrict-search
-?-help  输出此帮助消息
-X 输出非标准选项的帮助
-ea[:<packagename>... :<classname>]    -enableassertions[:<packagename>...
-da[:<packagename>... :<classname>]    -disableassertions[:<packagename>...
-esa -enablesystemassertions
-dsa -disablesystemassertions
-agentlib:<libname>[=<选项>] 加载本机代理库<libname>,例如-agentlib:hprof另请参阅-agentlib:jdwp=help和-agentlib:hprof=help
-agentpath:<pathname>[=<选项>] 按完整路径名加载本机代理库
-javaagent:<jarpath>[=<选项>] 加载Java编程语言代理,请参阅java.lang.instrument
-splash:<imagepath> 使用指定的图像显示启动屏幕有关详细信息,请参阅http://www.oracle.com/technetwork/java/javase/documentation/index.html。

三、非标准参数

列出非标准参数:java -X

202209062300088712.png

详细参数及作用如下:

-Xmixed 混合模式执行(默认)
-Xmixed 混合模式执行(默认)
-Xint 仅解释模式执行
-Xbootclasspath:<用;分隔的目录和zip/jar文件> 设置引导类和资源的搜索路径
-Xbootclasspath/a:<用;分隔的目录和zip/jar文件> 附加在引导类路径末尾
-Xbootclasspath/p:<用;分隔的目录和zip/jar文件> 置于引导类路径之前
-Xdiag 显示附加诊断消息
-Xnoclassgc 禁用类垃圾收集
-Xincgc 启用增量垃圾收集
-Xloggc:<file> 将GC状态记录在文件中(带时间戳)
-Xbatch 禁用后台编译
-Xms<size> 设置初始Java堆大小
-Xmx<size> 设置最大Java堆大小
-Xss<size> 设置Java线程堆栈大小
-Xprof 输出cpu分析数据
-Xfuture 启用最严格的检查,预计会成为将来的默认值
-Xrs 减少Java/VM对操作系统信号的使用(请参阅文档)
-Xcheck:jni 对JNI函数执行其他检查
-Xshare:off 不尝试使用共享类数据
-Xshare:auto 在可能的情况下使用共享类数据(默认)
-Xshare:on 要求使用共享类数据,否则将失败。
-XshowSettings 显示所有设置并继续
-XshowSettings:system 仅限Linux)显示系统或容器配置并继续
-XshowSettings:all 显示所有设置并继续
-XshowSettings:vm 显示所有与vm相关的设置并继续
-XshowSettings:properties 显示所有属性设置并继续
-XshowSettings:locale 显示所有与区域设置相关的设置并继续

注意:-X 选项是非标准选项。如有更改,恕不另行通知。

四、非Stable参数

参数名称 含义 默认值 备注
-Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.
-Xmx 最大堆大小 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制
-Xmn 年轻代大小(1.4orlator) 注意:此处的大小是(eden+2survivorspace).与jmap-heap中显示的Newgen是不同的。整个堆大小=年轻代大小+年老代大小+持久代大小.增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8
-XX:NewSize 设置年轻代大小(for1.3/1.4)
-XX:MaxNewSize 年轻代最大值(for1.3/1.4)
-XX:PermSize 设置持久代(permgen)初始值 物理内存的1/64
-XX:MaxPermSize 设置持久代最大值 物理内存的1/4
-Xss 每个线程的堆栈大小 JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右一般小的应用,如果栈不是很深,应该是128k够用的大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。(校长)和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"”-XssistranslatedinaVMflagnamedThreadStackSize”一般设置这个值就可以了。
-XX:ThreadStackSize ThreadStackSize 线程栈的大小,JDK5.0以后每个线程堆栈大小默认为1M,以前每个线程堆栈大小为256K;可以通过jvm参数-Xss来设置;注意-Xss是jvm的非标准参数,不强制所有平台的jvm都支持
-XX:NewRatio 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatio Eden区与Survivor区的大小比值 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:LargePageSizeInBytes 内存页的大小不可设置过大,会影响Perm的大小 =128m
-XX:+UseFastAccessorMethods 原始类型的快速优化
-XX:+DisableExplicitGC 关闭System.gc() 这个参数需要严格的测试
-XX:MaxTenuringThreshold 垃圾最大年龄 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代.对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率该参数只有在串行GC时才有效.
-XX:+AggressiveOpts 加快编译
-XX:+UseBiasedLocking 锁机制的性能改善
-Xnoclassgc 禁用垃圾回收
-XX:SoftRefLRUPolicyMSPerMB 每兆堆空闲空间中SoftReference的存活时间 1s 每兆堆空闲空间中SoftReference的存活时间
-XX:PretenureSizeThreshold 对象超过多大是直接在旧生代分配 0 单位字节新生代采用ParallelScavengeGC时无效另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象.
-XX:TLABWasteTargetPercent TLAB占eden区的百分比 1%
-XX:+CollectGen0First FullGC时是否先YGC FALSE

五、 并行收集器相关参数

参数名称 含义 默认值 备注
-XX:+UseParallelGC FullGC采用parallelMSC(此项待验证) 选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.(此项待验证)
-XX:+UseParNewGC 设置年轻代为并行收集 可与CMS收集同时使用JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值
-XX:ParallelGCThreads 并行收集器的线程数 此值最好配置与处理器数目相等同样适用于CMS
-XX:+UseParallelOldGC 年老代垃圾收集方式为并行收集(ParallelCompacting) 这个是JAVA6出现的参数选项
-XX:MaxGCPauseMillis 每次年轻代垃圾回收的最长时间(最大暂停时间) 如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值.
-XX:+UseAdaptiveSizePolicy 自动选择年轻代区大小和相应的Survivor区比例 设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开.
-XX:GCTimeRatio 设置垃圾回收时间占程序运行时间的百分比 公式为1/(1+n)
-XX:+ScavengeBeforeFullGC FullGC前调用YGC TRUE FullGC前调用年轻代GC

六、辅助参数

参数名称 含义 默认值 备注
-XX:+PrintGC 输出形式:[GC118250K->113543K(130112K),0.0094143secs][FullGC121376K->10414K(130112K),0.0650971secs]
-XX:+PrintGCDetails 输出形式:[GC[DefNew:8614K->781K(9088K),0.0123035secs]118250K->113543K(130112K),0.0124633secs][GC[DefNew:8614K->8614K(9088K),0.0000665secs][Tenured:112761K->10414K(121024K),0.0433488secs]121376K->10414K(130112K),0.0436268secs]
-XX:+PrintGCTimeStamps
-XX:+PrintGC:PrintGCTimeStamps 可与-XX:+PrintGC-XX:+PrintGCDetails混合使用输出形式:11.851:[GC98328K->93620K(130112K),0.0082960secs]
-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间.可与上面混合使用 输出形式:Totaltimeforwhichapplicationthreadswerestopped:0.0468229seconds
-XX:+PrintGCApplicationConcurrentTime 打印每次垃圾回收前,程序未中断的执行时间.可与上面混合使用 输出形式:Applicationtime:0.5291524seconds
-XX:+PrintHeapAtGC 打印GC前后的详细堆栈信息
-Xloggc:filename 把相关日志信息记录到文件以便分析.与上面几个配合使用
-XX:+PrintClassHistogram garbagecollectsbeforeprintingthehistogram.
-XX:+PrintTLAB 查看TLAB空间的使用情况
XX:+PrintTenuringDistribution 查看每次minorGC后新的存活周期的阈值 Desiredsurvivorsize1048576bytes,newthreshold7(max15)newthreshold7即标识新的存活周期的阈值为7。