JVM 参数选项

概述

本文根据 Java SE 8 英文文档翻译而来。

翻译艰难,转载说明出处。JVM 参数选项_慢耳朵的博客-CSDN博客

名词解释

名词解释
JVM虚拟机,Java Virtual Machine 
JDKJava SE Development Kit
JARJava 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]

  1. options - 选项
  2. classname - 执行的类名称
  3. filename - 执行的jar文件名称,只使用 -jar 选项时使用
  4. 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

----

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值