JVM启动参数分为三类。
一类是标准参数: 即 - 符号后面接的参数。所有JVM的实现都必须实现这些参数的功能,而且向后兼容。
一类是非标准参数或者叫扩展参数: 即 -X 符号后面接的参数。默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,而且不保证向后兼容。
还有一类是不稳定参数:即 -XX 符号后面接的参数。这类参数各个JVM实现会有所不同,将来可能会随时取消,需要谨慎使用。
整理了一下重要的启动参数列表。
标准参数列表
| 参数名 | 含义 |
| -client | 设置JVM使用client模式 |
| -server | 设置JVM使server模式 |
| -agentlib:libname[=options] | 用于装载本地lib包; 中libname为本地代理库文件名, 默认搜索路径为环境变量PATH中的路径 |
| -agentpath:pathname[=options] | 按全路径装载本地库,不再搜索PATH中的路径 |
| -classpath classpath | 告知JVM搜索目录名、jar文档名、zip文档名,之间用分号;分隔 |
| -Dproperty=value | 设置系统属性名/值对,运行在此jvm之上的应用程序 可用System.getProperty("property")得到value的值。 |
| -jar | 指定以jar包的形式执行一个应用程序。 |
| -verbose | 输出JVM的信息,可以在后面添加 class gc jni输出详细信息 |
扩展参数列表
| 参数名 | 含义 |
| -Xloggc:file | 将每次GC事件的相关情况记录到一个文件中 |
| -Xmn | 新生代大小 |
| -Xss | 每个线程的栈大小 |
| -Xms | 初始堆大小 |
| -Xmx | 堆内存的最大值 |
| -Xprof | 跟踪正运行的程序,并将跟踪数据在标准输出输出; 适合于开发环境调试。 |
不稳定参数列表
| 参数名 | 含义 |
| NewSize | 初始新生代值 |
| MaxNewSize | 最大新生代值 |
| NewRatio | 老年代和新生代的比值 |
| SurvivorRatio | Eden区和两个Survivor区的比值 |
| PermSize | 初始方法区的值 |
| MaxPermSize | 最大方法区的值 |
| MaxDirectMemorySize | 最大直接内存的值 |
| MaxTenuringThreshold | 新生代对象进入老年代的最大年龄 |
| PrintVMOptions | 打印显式参数 |
| PrintCommandLineFlags | 打印显式隐式参数 |
| PrintFlagsFinal | 打印所有系统参数 |
JVM有很多非稳定参数,上面列出的只是一小部分。想要查看所有非稳定参数,可以参考怎么查看JVM的参数?这篇文章的内容。
根据这篇文章中的内容, 我们可以运行
java -XX:+PrintFlagsFinal > jvm_flag_final.txt
把所有非稳定参数都导入到 jvm_flag_final.txt 中,如下图所示。

分析这个文件,它实际是一个5列的表格。
这5列分别是 Type | Name | Operator | Value | Application。
Type 表示这个参数的类型,类型表示这个参数可以被赋予的值。
//运行下面的shell命令,可以输出不重复的类型值cat jvm_flag_final.txt | awk '{if (NR!=1) {print $1}}' | sort | uniqboolccstrccstrlistdoubleintxuint64_tuintx
Name 表示参数名,在jvm_flag_final.txt 中总共有727个参数。
Operator 有两种,= 表示默认值,:= 意味着值是被修改的。
Value 表示参数的值。
Application表示参数适用范围。
\\运行下面的shell命令,可以输出不重复的Application值,加上注释,方便查看含义cat jvm_flag_final.txt | awk -F '\\{' '{if(NR!=1) {print "\{"$2}}' | sort | uniq{ARCH product}{C1 pd product}{C1 product}{C2 pd product}{C2 product}{lp64_product}{manageable}{pd product}{product rw}{product}
Application用复合标识符来表示参数适用的范围,下面解释一下单个参数的含义。
product 官方支持, JVM内部选项
rw 可动态写入的
C1 Client JIT 编译器
C2 Server JIT 编译器
pd platform Dependent 平台独立
lp64 仅 64 位JVM
manageable 外部定义的并且是可动态写入的
具体Application值的含义,可以查看这个文件
http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/tip/src/share/vm/runtime/globals.hpp
参考文档:
1 JVM启动参数大全 https://www.cnblogs.com/jpfss/p/12237079.html
2 [翻译]Java -XX:+PrintFlagsFinal命令行参数详解
https://emacsist.github.io/2016/01/11/%E7%BF%BB%E8%AF%91java-xx-printflagsfinal%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%AF%A6%E8%A7%A3/




