概述
本文根据 Java SE 8 英文文档翻译而来。
翻译艰难,转载说明出处。JVM 参数选项_慢耳朵的博客-CSDN博客
名词解释
名词 | 解释 |
---|---|
JVM | 虚拟机,Java Virtual Machine |
JDK | Java SE Development Kit |
JAR | Java Archive |
JDWP | 断点调试侦听协议,Java Debug Wire Protocol |
JVMTI | 虚拟机工具接口,JVM Tools Interface |
CDS | 类数据共享,class data sharing |
JFR | 飞行记录,Java Flight Recorder |
HPROF | 堆转储工具,heap profiler |
GC | 垃圾收集,garbage collector |
CMS | 并发标记清除,concurrent mark-sweep |
语法
java [options] classname [args]
java [options] -jar filename [args]
- options - 选项
- classname - 执行的类名称
- filename - 执行的jar文件名称,只使用 -jar 选项时使用
- args - 使用空格分隔多个参数,并传递给运行的main方法
options
1、标准选项 Standard Options
标准选项:市面上所有虚拟机都支持的最常用选项。一般以 '-' 开头。
-help
-?
显示可用的option信息
-agentlib:libname[=options]
加载原生(Native)代理类库。
libname: native类库名称
options: 传递给类库的参数;以逗号','分隔多个参数
如 -agentlib:foo ,虚拟机会加载 libfoo.so 名称的类型,类库位置位于环境变量 LD_LIBRARY_PATH (OS X系统环境变量是 DYLD_LIBRARY_PATH )指向的目录。
示例1,加载“堆分析工具(hprof)库”,间隔20ms一次采样CPU信息,跟踪3层栈深:
-agentlib:hprof=cpu=samples,interval=20,depth=3
示例2,加载 JDWP(Java Debug Wire Protocol) 断点调试侦听协议库,并监听8080端口:
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
更多原生代理类库,参考链接:
java.lang.instrument: java.lang.instrument (Java Platform SE 8 )
jvmti: JVM(TM) Tool Interface 1.2.3
-agentpath:pathname[=options]
和上面的 -agentlib:libname[=options] 选项功能相同
pathname: 原生代理类库全路径名
-client
采用Client VM运行程序。64位JDK会忽略,并使用Server VM替换此选项。
默认选项,查看链接 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html
-server
采用Server VM运行程序。只有64位JDK支持 Server VM,会自动使用 -server 选项。
-d32
以32位JDK运行程序。如果未安装或不支持32位JDK将会报错。如果未安装64位JDK,默认使用32位JDK。
-d64
以64位JDK运行程序。如果未安装或不支持64位JDK将会报错。如果未安装64位JDK,默认使用32位JDK。
目前只有64位JDK支持 Server VM,使用了 -server 选项则默认使用 -d64 选项;使用了 -client 选项则会忽略 -d64 选项。
-Dproperty=value
使用 -D 来设置系统属性。
property: 属性名称,不带空格的字符串
value: 属性值,如果属性值中有空格,使用引号括起来。如(-Dfoo="foo bar")
-disableassertions[:[packagename]...|:classname]
-da[:[packagename]...|:classname]
禁用断言(assertions)。默认禁用所有包和类的断言。-da 是 -disableassertions的缩写。
如果不设置 packagename 参数将禁用所有包的断言,但不禁用系统类(这个特性可以很容易禁用除系统类之外的所有类的断言);如果设置了 packagename 参数,并且以 ... 结尾,禁用包及其所有子包的断言;如果 packagename 参数设置成 ... ,禁用当前工作目录下没有包的所有类的断言;如果设置了 classname 参数,禁用这个类的断言。
该选项适用于所有类加载器和系统类(没有类加载器的类。这里的system classes文档上说没有类加载器的类“system classes (which do not have a class loader)”,无法理解,有没有大神能给指点指点,不胜感激!)。
示例:java -da:com.wombat.fruitbat.Brickbat MyClass
-disablesystemassertions
-dsa
禁用所有系统类的断言。
-enableassertions[:[packagename]...|:classname]
-ea[:[packagename]...|:classname]
启用断言。默认禁用所有包和类的断言。-ea 是 -enableassertions 的缩写,与 -da 选项功能相反。
如果不设置 packagename 参数将启用所有包的断言,但不启用系统类(这个特性可以很容易启用除系统类之外的所有类的断言);如果设置了 packagename 参数,并且以 ... 结尾,启用包及其所有子包的断言;如果 packagename 参数设置成 ... ,启用当前工作目录下没有包的所有类的断言;如果设置了 classname 参数,启用这个类的断言。
该选项适用于所有类加载器和系统类(没有类加载器的类)。
示例:java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyClass
-enablesystemassertions
-esa
启用所有系统类的断言。与 -dsa 选项功能相反。
-jar filename
执行 jar 文件。
filename: jar 文件名称,jar 包中的 manifest 文件内容中含有一行带 main 函数的可执行类: Main-Class:classname
当使用 -jar 选项,JAR 文件是所有用户类的来源,其它类路径将被忽略。
jar命令使用手册:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jar.html
http://docs.oracle.com/javase/8/docs/technotes/guides/jar/index.html
http://docs.oracle.com/javase/tutorial/deployment/jar/index.html
-javaagent:jarpath[=options]
探针技术( java.lang.instrument)
更多信息:java.lang.instrument (Java Platform SE 8 )
-jre-restrict-search
将用户私有JREs纳入version search
-no-jre-restrict-search
将用户私有JREs剔除version search
-showversion
显示版本信息并继续执行程序。
-version
显示版本信息并退出程序。
-version:release
指定版本运行程序。如果运行程序的 java 命令版本不匹配,但是系统中有匹配的其它 java 命令,则使用匹配的 java 命令来运行程序。
release: 版本号,使用空格分隔多个版本号或者版本区间范围。当有空格时使用引号(")括起来。
示例:-version:"1.6.0_13 1.6* & 1.6.0_10+"
*: 通配
+: 大于当前设定的版本
: 空格,逻辑或
&: 逻辑与(并且)
-splash:imgname
设置启动画面。
示例:-splash:images/splash.gif
-verbose:class
显示每个类加载信息
-verbose:gc
显示每一次GC信息
-verbose:jni
显示原生方法的使用和其它JNI的活动信息。
2、非标准选项 Non-Standard Options
非标准选项是HotSpot VM的通用选项。其它 JVM 不一定需要实现或者实现功能不一定相同。一般以 -X 开头。
-X
显示非标准选项的帮助信息。
非标选项内容较多,慢慢完善。未完待续……
3、高级运行时选项 Advanced Runtime Options
4、高级即时编译选项 Advanced JIT Compiler Options
5、高级可维护性选项 Advanced Serviceability Options
这些选项用来收集系统信息和运行调试。
-XX:+ExtendedDTraceProbes
启用 dtrace 探针,这个选项会影响性能。默认禁用此选项,只使用标准探针。
-XX:+HeapDumpOnOutOfMemoryError
发生OOM时使用HPROF工具转储堆到当前目录。默认禁用此选项,不转储堆。
-XX:HeapDumpPath=path
设置堆转储路径。默认转储文件保存在当前目录,命名格式为:java_pidpid.hprof(pid是进程ID)。
示例:
-XX:HeapDumpPath=./java_pid%p.hprof
-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof
-XX:LogFile=path
设置日志文件路径。默认在当前目录中创建名称为 hotspot.log 的日志文件。
示例:-XX:LogFile=/var/log/java/hotspot.log
-XX:+PrintClassHistogram
在按下“Ctrl + C”,触发事件(SIGTERM)后打印类实例直方图,默认禁用此选项。
相当于运行命令 “jmap -histo”或者“jcmd pid(进程id) GC.class_histogram”
-XX:+PrintConcurrentLocks
在按下“Ctrl + C”,触发事件(SIGTERM)后打印 java.util.concurrent 中的锁信息。默认禁用此选项。
相当于运行命令“jstack -l”或者“jcmd pid(进程id) Thread.print -l”
-XX:+UnlockDiagnosticVMOptions
解锁诊断JVM的选项。默认禁用此选项,诊断选项不可用。
6、高级垃圾回收选项 Advanced Garbage Collection Options
这些选项用于控制虚拟机如何进行垃圾回收。
-XX:ActiveProcessorCount=x
虚拟机用于计算线程池的CPU数量。线程池用于各种操作,如:GC垃圾回收和ForkJoinPool。
虚拟机使用处理器数量取决于操作系统。该选项对于在docker容器中运行多个java进程时,划分CPU资源非常有用。即使未开启选项 UseContainerSupport ,也可以使用此选项。
-XX:+AggressiveHeap
开启堆优化。根据计算机的配置(RAM和CPU),设置各种参数给长时间运行的任务使用密集的内存分配。默认禁用此选项。
-XX:+AlwaysPreTouch
JVM初始化堆时直接分配物理内存。在进入main()方法之前直接分配所有物理内存。这个选项可用于模拟系统长时间运行后虚拟内存转为物理内存。默认禁用此选项。
注意:JVM进程启动时分配的只是虚拟内存,只有JVM真正使用时才会被分配物理内存。
优点:加快代码运行效率;缺点:JVM进程启动慢。
-XX:+CMSClassUnloadingEnabled
当使用CMS GC时启用类卸载。默认启用该选项。
禁用类卸载选项:-XX:-CMSClassUnloadingEnabled
-XX:CMSExpAvgFactor=percent
设置在计算并发收集统计的指数平均值时用于对当前样本进行加权的时间百分比(0~100)。默认值 25%。
示例:-XX:CMSExpAvgFactor=15
-XX:CMSInitiatingOccupancyFraction=percent
设置老年代使用率(0~100)达到多少时启动CMS GC。默认值 -1。
1、如果值在 0~100之间,由CMSInitiatingOccupancyFraction设置的值决定;
2、如果是负值,意味着使用 -XX:CMSTriggerRatio 选项来计算占用率。
计算公式: ((100 - MinHeapFreeRatio) + (double)( CMSTriggerRatio * MinHeapFreeRatio) / 100.0) / 100.0
初始值: MinHeapFreeRatio = 40, CMSTriggerRatio = 80
计算结果: ((100 - 40) + (double) 80 * 40 / 100 ) / 100 = 92 %
意味着将在老年代占用率达到92%时才会启动CMS GC
示例:-XX:CMSInitiatingOccupancyFraction=20
-XX:+CMSScavengeBeforeRemark
在重新标记步骤执行之前,先执行一次新生代GC。默认禁用该选项
因为老年代和年轻代之间对象存在跨代引用,因此老年代进行GC Roots追踪时,同样也会扫描年轻代,在重新标记前先执行一次新生代GC,则可以少扫描一些对象,提升重新标记性能。
-XX:CMSTriggerRatio=percent
百分比(0~100)值,和选项 -XX:MinHeapFreeRatio 一起计算得出启动CMS GC的触发条件。默认 80%。
示例:-XX:CMSTriggerRatio=75
-XX:ConcGCThreads=threads
设置Full GC线程数。默认值取决于JVM可用的CPU数量。
示例:-XX:ConcGCThreads=2
-XX:+DisableExplicitGC
禁用 System.gc()。默认禁用此选项,不禁用 System.gc()。
如果禁用 System.gc(),JVM必要时仍会执行 GC。
-XX:+ExplicitGCInvokesConcurrent
调用 System.gc() 时执行Full GC。默认禁用此选项,且只能与选项 -XX:+UseConcMarkSweepGC 一起使用
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
调用 System.gc() 时执行Full GC,并且在GC期间卸载类。默认禁用此选项,且只能与选项 -XX:+UseConcMarkSweepGC 一起使用。
-XX:G1HeapRegionSize=size
设置 G1 收集器 region 大小。这个值可以是 1MB ~ 32MB 之间。默认大小由堆大小决定。
示例:-XX:G1HeapRegionSize=16m
计算规则可以参考:G1垃圾回收器REGION SIZE说明_zhangjunli的博客-CSDN博客_g1 region 大小
-XX:+G1PrintHeapRegions
打印关于G1收集器region分配和回收信息。默认禁用此选项。
-XX:G1ReservePercent=percent
G1为分配担保预留的空间比例。默认值 10%。老年代会预留 10% 的空间给新生代对象晋升,如果经常发生新生代晋升失败而导致Full GC,可以调高此阈值。调高后老年代实际可用空间将减少。
示例:-XX:G1ReservePercent=20
-XX:InitialHeapSize=size
设置堆初始值大小。值必须为0或者是1024的倍数,且大于1MB。单位 k/K KB, m/M MB, g/G GB。默认值由系统配置决定,一般为当前内存的1/4,具体参考链接:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html
示例:
-XX:InitialHeapSize=6291456
-XX:InitialHeapSize=6144k
-XX:InitialHeapSize=6m
如果设置为0,初始大小为老年代和新生代之和。新生代大小使用 -XX:NewSize 选项设置。
注意:-Xms也可以设置初始堆大小,如果命令行中同时使用了 -Xms 和 -XX:InitialHeapSize 选项,且 -Xms 靠后,将使用 -Xms 设置初始堆大小。
-XX:MaxHeapSize=size
设置最大堆内存。值必须大于2MB且是1024的位数。单位 k/K KB, m/M MB, g/G GB。默认值根据系统配置决定。
示例,设置80MB:
-XX:MaxHeapSize=83886080
-XX:MaxHeapSize=81920k
-XX:MaxHeapSize=80m
和选项 -Xmx 功能相同。
-XX:MaxHeapFreeRatio=percent
在GC后允许最大空闲堆空间比例。如果空闲堆空间超过比例,则缩容堆大小。默认值 70 %。
示例:-XX:MaxHeapFreeRatio=75
-XX:MinHeapFreeRatio=percent
在GC后允许最小空闲堆空间比例。如果空闲堆空间小于比例,则扩容堆大小。默认值 40 %。
示例:-XX:MinHeapFreeRatio=25
-XX:MaxNewSize=size
设置堆内存中新生代最大值(字节)。默认自动调整。
-XX:MaxTenuringThreshold=threshold
设置对象存活了多少个GC次后晋升到老年代。最大值 15。并行(吞吐量)收集器的默认值 15,CMS 收集器默认值是 6。
示例:-XX:MaxTenuringThreshold=10
-XX:MaxMetaspaceSize=size
设置元数据占用原生内存最大值。默认不限制。
示例:-XX:MaxMetaspaceSize=256m
-XX:InitialSurvivorRatio=ratio
设置幸存区比例,如果使用追求吞吐量的GC(如 -XX:+UseParallelGC 或 -XX:+UseParallelOldGC ),会使用当前比例初始化幸存区。并在运行期间,根据应用使用情况,自动调整幸存区的比例。如果禁用自动调整大小选项(-XX:-UseAdaptiveSizePolicy),那么应该使用 -XX:SurvivorRatio 指定运行期间幸存区大小。
可以根据年轻代(Y)大小和初始幸存区比例(R)来计算幸存区初始空间(S)大小,公式:S=Y/(R+2)。公式中的 2 代表有2个幸存区,幸存区初始比例(R)越大,则幸存区初始空间越小。
默认值 8。如果年轻代空间是 2MB,幸存区空间则为 0.2 MB。
示例:-XX:InitialSurvivorRatio=4
-XX:SurvivorRatio=ratio
设置 eden 区和 survivor 区比率。默认值 8。
示例,设置比率为 4:-XX:SurvivorRatio=4
-XX:TargetSurvivorRatio=percent
幸存区空间可使用比率。默认值 50 %。
示例:-XX:TargetSurvivorRatio=30
-XX:MaxGCPauseMillis=time
设置GC最大停顿时间(毫秒)。JVM尽最大努力实现,并不强制达到目标。默认无最大停顿时间。
示例:-XX:MaxGCPauseMillis=500
-XX:InitialRAMPercentage=percent
初始堆内存占据最大物理内存(-XX:MaxRAM)的百分比。默认值 1.5625 %。当未设置选项 -XX:InitialHeapSize 和 -Xms时,用于计算初始堆大小。
示例:-XX:InitialRAMPercentage=5
-XX:MaxRAMPercentage=percent
最大堆内存占据最大物理内存(-XX:MaxRAM)的百分比。默认值 25 %。
如果此选项和其它影响最大内存量的选项一起使用大于被压缩oops(对象指针)的可寻址内存范围,则禁用自动压缩oops。
示例:-XX:MaxRAMPercentage=75
-XX:MinRAMPercentage=percent
最大堆内存最小值占据最大物理内存(-XX:MaxRAM)的百分比。小堆大约 125 MB。默认值 50 %。
示例:-XX:MinRAMPercentage=75
-XX:InitiatingHeapOccupancyPercent=percent
当整个堆(不仅仅是某一代)内存占用率(0~100)达到阈值时启动Full GC。默认值 45 %。如果值为 0 意味着不间断的GC。
示例:-XX:InitiatingHeapOccupancyPercent=75
-XX:ParallelGCThreads=threads
设置年轻代和老年代并行GC线程数量。默认值取决于JVM可用的CPU数量。
示例:-XX:ParallelGCThreads=2
-XX:+ParallelRefProcEnabled
启用并行引用处理。默认禁用此选项。
-XX:+PrintAdaptiveSizePolicy
打印关于自适应分代大小信息 。默认禁用此选项。
-XX:+PrintGC
打印每个GC信息。默认禁用此选项。
-XX:+PrintGCApplicationConcurrentTime
打印自上一次暂停(如GC暂停)以来过了多长时间。默认禁用此选项。
-XX:+PrintGCApplicationStoppedTime
打印上一次暂停(如GC暂停)多长时间。默认禁用此选项。
-XX:+PrintGCDateStamps
打印每个GC日期戳。默认禁用此选项。
-XX:+PrintGCDetails
打印每个GC明细信息。默认禁用此选项。
-XX:+PrintGCTaskTimeStamps
打印每个GC工作线程的时间戳。默认禁用此选项。
-XX:+PrintGCTimeStamps
打印每个GC时间戳。默认禁用此选项。
-XX:+PrintStringDeduplicationStatistics
打印字符串去重统计信息。默认禁用此选项。参考 -XX:+UseStringDeduplication 选项。
-XX:+PrintTenuringDistribution
打印晋升年龄信息。默认禁用此选项。
-XX:+ScavengeBeforeFullGC
每次Full GC之前启动一次Yong GC。默认启用此选项。Oracle建议不要禁用它,因为在Full GC之前做一次Yong GC,在枚举GC Roots时可以减少扫描年轻代对象数量。
使用选项 -XX:-ScavengeBeforeFullGC 禁用选项。
-XX:SoftRefLRUPolicyMSPerMB=time
软引用对象最近一次被访问后活动时间。默认是 1 秒钟。
软引用被回收计算公式“clock - timestamp <= freespace * SoftRefLRUPolicyMSPerMB”
clock - 上次GC时间戳,timestamp - 最近一次读取软引用对象时间戳;差值表示软引用多久没有使用了,值越大表示越久没用。
freespace * SoftRefLRUPolicyMSPerMB - 表示虚拟机达到阈值将会回收软引用。
示例,设置 2.5 秒:-XX:SoftRefLRUPolicyMSPerMB=2500
-XX:StringDeduplicationAgeThreshold=threshold
字符串对象达到去重的GC年龄。默认值 3。
-XX:TLABSize=size
----