jvm是java的运行环境,在jvm中有很多的参数可以进行设置,合理的设置参数可以让jvm在各种环境中都能够高效的运行,对于我们开发者而言,jvm的绝大部分参数保持默认即可,不需要我们手动的更改,但是了解jvm支持的参数及功能也对我们往后的开发至关重要。
一、前言
jvm的参数类型主要有一下三种:
- 标准参数:jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help检索出所有的标准参数;
- 非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
- 非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用。
按照参数类型可以分成以下三种:
- 布尔型参数选项:-XX:+ 打开, -XX:- 关闭;
- 数字型参数选项通过-XX:=设定;
- 字符行参数选项通过-XX:=设定,通常用来指定一个文件,路径,或者一个命令列表。
二、标准参数
如果需要获取标准参数详细说明,可以按照如下方法:
列出标准参数:java -help
详细参数及作用如下:
-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
详细参数及作用如下:
-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。 |