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 位数据模型 (如果可用) |
-d64 | 使用 64 位数据模型 (如果可用) |
-server | 选择 "server" VM,默认 VM 是 server. |
-cp<目录和 zip/jar 文件的类搜索路径> -classpath | <目录和 zip/jar 文件的类搜索路径>用 ; 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。 |
-D<名称>=<值> | 设置系统属性 |
-verbose:[class|gc|jni] | 启用详细输出 |
-version | 输出产品版本并退出 |
-version:<值> | 警告: 此功能已过时, 将在未来发行版中删除。需要指定的版本才能运行 |
-showversion | 输出产品版本并继续 |
-jre-restrict-search | -no-jre-restrict-search | 警告: 此功能已过时, 将在未来发行版中删除。在版本搜索中包括/排除用户专用 JRE |
-? -help | 输出此帮助消息 |
-X | 输出非标准选项的帮助 |
-ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] | 按指定的粒度启用断言 |
-da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] | 禁用具有指定粒度的断言 |
-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 | 混合模式执行(默认) |
-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.4or lator) | 注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小. 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 | |
-XX:NewSize | 设置年轻代大小(for 1.3/1.4) | ||
-XX:MaxNewSize | 年轻代最大值(for 1.3/1.4) | ||
-XX:PermSize | 设置持久代(perm gen)初始值 | 物理内存的1/64 | |
-XX:MaxPermSize | 设置持久代最大值 | 物理内存的1/4 | |
-Xss | 每个线程的堆栈大小 | JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右 一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。(校长) 和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"” -Xss is translated in a VM flag named ThreadStackSize” 一般设置这个值就可以了。 | |
-XX:ThreadStackSize | Thread Stack Size | 线程栈的大小,JDK5.0以后每个线程堆栈大小默认为1M,以前每个线程堆栈大小为256K;可以通过jvm参数-Xss来设置;注意-Xss是jvm的非标准参数,不强制所有平台的jvm都支持 | |
-XX:NewRatio | 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) | -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 Xms=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 | 单位字节 新生代采用Parallel Scavenge GC时无效 另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象. |
-XX:TLABWasteTargetPercent | TLAB占eden区的百分比 | 1% | |
-XX:+CollectGen0First | FullGC时是否先YGC | FALSE |
五、并行收集器相关参数
参数名称 | 含义 | 默认值 | 备注 |
-XX:+UseParallelGC | Full GC采用parallel MSC (此项待验证) | 选择垃圾收集器为并行收集器.此配置仅对年轻代有效.即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集.(此项待验证) | |
-XX:+UseParNewGC | 设置年轻代为并行收集 | 可与CMS收集同时使用 JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值 | |
-XX:ParallelGCThreads | 并行收集器的线程数 | 此值最好配置与处理器数目相等 同样适用于CMS | |
-XX:+UseParallelOldGC | 年老代垃圾收集方式为并行收集(Parallel Compacting) | 这个是JAVA 6出现的参数选项 | |
-XX:MaxGCPauseMillis | 每次年轻代垃圾回收的最长时间(最大暂停时间) | 如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值. | |
-XX:+UseAdaptiveSizePolicy | 自动选择年轻代区大小和相应的Survivor区比例 | 设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开. | |
-XX:GCTimeRatio | 设置垃圾回收时间占程序运行时间的百分比 | 公式为1/(1+n) | |
-XX:+ScavengeBeforeFullGC | Full GC前调用YGC | TRUE | Full GC前调用 年轻代GC |
六、辅助参数
参数名称 | 含义 | 默认值 | 备注 |
-XX:+PrintGC | 输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] | ||
-XX:+PrintGCDetails | 输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] | ||
-XX:+PrintGCTimeStamps | |||
-XX:+PrintGC:PrintGCTimeStamps | 可与-XX:+PrintGC -XX:+PrintGCDetails混合使用 输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] | ||
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间.可与上面混合使用 | 输出形式:Total time for which application threads were stopped: 0.0468229 seconds | |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间.可与上面混合使用 | 输出形式:Application time: 0.5291524 seconds | |
-XX:+PrintHeapAtGC | 打印GC前后的详细堆栈信息 | ||
-Xloggc:filename | 把相关日志信息记录到文件以便分析. 与上面几个配合使用 | ||
-XX:+PrintClassHistogram | garbage collects before printing the histogram. | ||
-XX:+PrintTLAB | 查看TLAB空间的使用情况 | ||
XX:+PrintTenuringDistribution | 查看每次minor GC后新的存活周期的阈值 | Desired survivor size 1048576 bytes, new threshold 7 (max 15) new threshold 7即标识新的存活周期的阈值为7。 |