JVM-Java运行参数

JVM-Java运行参数

  • 1. 概述
  • 2. 标准参数(-)
    • 2.1 运行模式相关的
        • -client 和 -server
    • 2.2 类、jar 路径相关的
        • -cp
        • -classpath
    • 2.3 运行调试相关的
      • verbose
        • -verbose:class
        • -verbose:gc
        • -verbose:jni
      • 断言
        • -ea
        • -da
    • 2.4 设置系统环境变量的 -D 参数
  • 3. 非标准参数(-X)
    • 3.1 堆栈配置、垃圾回收
        • -Xmx
        • -Xms
        • -Xmn
        • -XX:NewSize
        • -XX:MaxNewSize
        • -XX:PermSize
        • -XX:MaxPermSize
        • -Xnoclassgc
    • 3.2 编译优化相关的
        • -Xss
        • -Xbatch
        • -Xmixed
        • -Xint
        • -Xcomp
        • -Xmaxjitcodesize=size
    • 3.3 调试监控
        • -Xloggc
        • -Xprof
        • -Xdiag
        • -Xdebug
        • -Xcheck:jni
        • -Xfuture
        • -Xverify:mode
    • 3.4 其他
        • -X
        • -Xbootclasspath:path
        • -Xbootclasspath/a:path
        • -Xbootclasspath/p:path
        • -Xinternalversion
        • -Xrs
        • -Xshare:mode
        • -XshowSettings:category
        • -javaagent:[=<选项>]
  • 4. 非 stable 参数(-XX)
        • -XX:GCTimeRatio=n
        • -XX:MaxGCPauseMills
        • -XX:MaxTenuringThreshold
        • -XX:ParallelGCThreads
        • -XX:PretenureSizeThreshold
        • -XX:+PrintGCDetails
        • -XX:SurvivorRatio
        • -XX:UseAdaptiveSizePolicy
        • -XX:+UseSerialGC
        • -XX:+TraceClassLoading
        • -XX:MetaspaceSize
        • -XX:MaxMetaspaceSize
        • -XX:+UseParallelGC
        • -XX:+UseParallelOldGC
        • -XX:+HeapDumpOnOutOfMemoryError
        • -XX:+PrintGCTimeStamps
        • -XX:+PrintGCDateStamps
        • -XX:+UseConcMarkSweepGC
        • -XX:-DisableExplicitGC
        • -XX:+MaxFDLimit
        • -XX:+ScavengeBeforeFullGC
        • -XX:+UseGCOverheadLimit
        • -XX:-UseConcMarkSweepGC
        • -XX:-UseParallelGC
        • -XX:-UseParallelOldGC
        • -XX:-UseSerialGC
        • -XX:+UseThreadPriorities
        • -XX:LargePageSizeInBytes=4m
        • -XX:MaxHeapFreeRatio=70描述
        • -XX:MinHeapFreeRatio=40
        • -XX:NewRatio=2
        • -XX:ReservedCodeCacheSize=32m
        • -XX:ThreadStackSize=512
        • -XX:+UseLargePages
        • -XX:HeapDumpPath=./java_pid.hprof
        • -XX:-HeapDumpOnOutOfMemoryError
        • -XX:-PrintConcurrentLocks
        • -XX:-TraceClassLoading
        • -XX:OnError=";"
  • 参考文档

1. 概述

Java 支持的运行参数包括如下几种:

  • 标准参数(-):所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容
  • 非标准参数(-X):官方 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容
  • 非 Stable 参数(-XX):此类参数各个 JVM 实现会有所不同,将来可能会随时取消,需慎重使用

2. 标准参数(-)

标准参数又分为如下几种:

  • 运行模式相关的,如 -server、-client
  • 类、jar 路径相关的,如 -cp、-classpath
  • 运行调试相关的,如断言开关(-ea 和 -da)、-verbose 系列(-verbose:class,-verbose:gc 等)
  • 设置系统变量的 -D 参数

2.1 运行模式相关的

-client 和 -server

JVM 工作在 Server 模式可以大大提高性能,但应用的启动会比 Client 模式慢大概10%。
当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以 Server 模式启动,否则以 Client 模式启动。
Client 模式启动速度较快,Server 模式启动较慢;但是启动进入稳定期长期运行之后 Server 模式的程序运行速度比 Client 要快很多。这是因为 Server 模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而 Client 模式启动的 JVM 采用的是轻量级的虚拟机。所以 Server 启动慢,但稳定后速度比 Client 远远要快。

2.2 类、jar 路径相关的

-cp

-classpath

2.3 运行调试相关的

verbose

在程序运行的时候究竟会有多少类被加载呢,一个简单程序会加载上百个类的!
你可以用 verbose:class 来监视,在命令行输入 java -verbose:class XXX (XXX为程序名) 你会在控制台看到加载的类的情况。
verbose 和 verbose:class 含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:
[Loaded java.io.FilePermission$1 from shared objects file]
当虚拟机报告类找不到或类冲突时可用此参数来诊断从虚拟机装入类的情况。

-verbose:class

显式虚拟机记载的类的情况

-verbose:gc

显示虚拟机内存回收情况,在虚拟机发生内存回收时在输出设备显示内存回收信息,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]

-verbose:gc						// 虚拟机发生 GC 时,打印内存回收情况

-verbose:jni

断言

Java 断言默认是不启用的。在运行时,是需要显式开启才能生效,否则断言没有任何意义。
断言可以开启局部断言,格式如下:

-ea:<classname>				java -ea:MyClass1 	打开 MyClass1 的 assertion
-da:<classname> 			java -da: MyClass1 	关闭MyClass1的assertion
-ea:<packagename> 			java -ea:pkg1 		打开pkg1包的assertion
-da:<packagename> 			java -da:pkg1 		关闭pkg1包的assertion
-ea:... java -ea:... 		打开缺省包(无名包)的assertion
-da:... java -da:... 		关闭缺省包(无名包)的assertion
-ea:<packagename>... 		java -ea:pkg1... 	打开pkg1包和其子包的assertion
-da:<packagename>... 		java -da:pkg1... 	关闭pkg1包和其子包的assertion
-esa java -esa 				打开系统类的assertion
-dsa java -dsa 				关闭系统类的assertion

当开始断言后,程序中的如下代码就会生效:

assert <布尔表达式> 
assert <布尔表达式> : <错误信息> 

-ea

开启断言

-da

关闭断言,也可不指定 -ea 参数(默认关闭断言)

2.4 设置系统环境变量的 -D 参数

3. 非标准参数(-X)

3.1 堆栈配置、垃圾回收

-Xmx

设置 JVM 堆的最大值

-Xmx3550							// 设置 JVM 堆的最大值为 3550M

-Xms

设置 JVM 堆的最小值

-Xms3550M 							// 设置 JVM 堆的最小值为 3550M

-Xmn

设置初始和最大的年轻代大小,可以指定单位k(K),m(M),g(G)。
年轻代用于存储新创建的对象,这个区域的垃圾回收的频率要比其他区域高的多。如果这个区域太小了,那么垃圾回收的次数就会太多;如果太大了,垃圾回收就会浪费很多的时间。oracle建议年轻代的大小是堆总大小的四分之一到二分之一之间。

我们还可以通过其他两个选项来代替这个选项来指定年轻代最小和最大内存:
-XX:NewSize 设置年轻代的初始内存
-XX:MaxNewSize 设置年轻代的最大内存

# 设置新生代大小为 2G
-Xmn2G

# 下面的例子展示了怎么设置年轻代的大小为256M
-Xmn256m
-Xmn262144k
-Xmn268435456

-XX:NewSize

-XX:NewSize 设置年轻代的初始内存;

-XX:NewSize=512m					# 设置年轻代的初始内存为 512M

-XX:MaxNewSize

-XX:MaxNewSize 设置年轻代的最大内存;

-XX:MaxNewSize=512m					# 设置年轻代的最大内存为 512M

-XX:PermSize

JDK1.8取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize参数失效,取而代之的是-XX:MetaspaceSize -XX:MaxMetaspaceSize
-XX:PermSize 设置老年代的初始内存

-XX:PermSize=64M					# 设置老年代的初始内存为 64M

-XX:MaxPermSize

JDK1.8取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize参数失效,取而代之的是-XX:MetaspaceSize -XX:MaxMetaspaceSize
-XX:MaxPermSize 设置老年代的最大内存

-XX:MaxPermSize=64M					# 设置老年代的最大内存为 64M

-XX:MetaspaceSize
-XX:MaxMetaspaceSize

-Xnoclassgc

3.2 编译优化相关的

-Xss

ss: stack size,设置每个线程的栈大小,单位:k(K)、m(M)、g(G)。
JDK5.0 以后每个线程栈大小为 1M,之前每个线程栈大小为 256K。
在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
需要注意的是:当这个值被设置的较大时(例如 > 2MB)将会在很大程度上降低系统的性能。
这个选项和 -XX:ThreadStackSize 相同。

-Xss128k 							// 设置线程栈大小为128K

JAVA最多支持多少个线程

-Xbatch

-Xmixed

-Xint

-Xcomp

-Xmaxjitcodesize=size

3.3 调试监控

-Xloggc

把 GC 信息输出到文件中,和 verbose:gc 的内容是一样的。
如果这两个命令一起使用的话,Xloggc 会覆盖 verbose:gc 命令。

-Xloggc:garbage-collection.log 		// 将 GC 信息输出到 garbage-collection.log 文件中

-Xprof

-Xdiag

-Xdebug

-Xcheck:jni

-Xfuture

-Xverify:mode

3.4 其他

-X

-Xbootclasspath:path

-Xbootclasspath/a:path

-Xbootclasspath/p:path

-Xinternalversion

-Xrs

-Xshare:mode

-XshowSettings:category

-javaagent:[=<选项>]

加载 Java 代理, 请参阅 java.lang.instrument

-javaagent:/usr/local/eclipse/lombok.jar	# 加载 Java 代理 lombok.jar 包

java.lang.instrument使用
Instrumentation 新功能
技术问答集锦(13)Java Instrument原理
深入理解Instrument(一)

4. 非 stable 参数(-XX)

-XX:GCTimeRatio=n

设置垃圾收集时间占程序运行时间的百分比,默认值为 99,就是允许最大 1/100 的垃圾收集时间。公式为1/(1+n)

-XX:GCTimeRatio=99			// 设置垃圾收集占程序总运行时间的比例为 1/100

JVM参数配置详解(包含JDK1.8)
《深入理解Java虚拟机_第2版》3.5.3 Parallel Scavenge 收集器

-XX:MaxGCPauseMills

该参数主要用于 Parallel Scavenge 收集器,由于Parallel Scavenge 收集器为新生代收集器,所以该参数主要用于设置新生代垃圾收集最大暂停时间,即新生代最大垃圾收集时间不超过该值,单位为 ms

-XX:MaxGCPauseMillis=100	// 设置新生代垃圾收集最大暂停时间为 100ms

JVM参数配置详解(包含JDK1.8)
《深入理解Java虚拟机_第2版》3.5.3 Parallel Scavenge 收集器

-XX:MaxTenuringThreshold

对象晋升到老年代的年龄阈值

-XX:PretenureSizeThreshold=1			// 设置对象晋升到老年代的年龄阈值为 1

《深入理解Java虚拟机_第2版》3.6.3 长期存活的对象将进入老年代

-XX:ParallelGCThreads

设置并行GC时进行内存回收的线程数

-XX:ParallelGCThreads=8					// 设置并行GC时进行内存回收的线程数

-XX:PretenureSizeThreshold

设置对象进入老年代的大小阈值,大于这个值的对象直接在老年代分配,单位必须为字节

-XX:PretenureSizeThreshold=3145728		// 大于 3145728 的对象将直接在老年代进行分配 

《深入理解Java虚拟机_第2版》3.6.2 大对象直接进入老年代

-XX:+PrintGCDetails

打印虚拟机内存回收日志

-XX:+PrintGCDetails						// 打印虚拟机内存回收日志

-XX:SurvivorRatio

新生代中 Eden 区域与 Survivor 区域的容量比值,默认为 8,代表 Eden:Survivor=8:1。

-XX:SurvivorRatio=8				// Eden 区域与 Survivor 区域的比值,Eden:Survivor=8:1

-XX:UseAdaptiveSizePolicy

设置虚拟机使用 GC 自适应的调节策略,使用该参数之后,将不再需要设置 -Xmn、-XX:SurvivorRatio、-XX:PretenureSizeThreshold 等细节参数,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量。

-XX:UseAdaptiveSizePolicy				// 设置 JVM 使用 GC 自适应的调节策略

JVM参数配置详解(包含JDK1.8)
《深入理解Java虚拟机_第2版》3.5.3 Parallel Scavenge 收集器

-XX:+UseSerialGC

虚拟机运行在Client模式下的默认值,打开此开关后,使用 Serial + Serial Old 的收集器组合进行内存回收

-XX:+TraceClassLoading

跟踪显示类加载的过程

-XX:+TraceClassLoading					// 跟踪显示类加载的过程

-XX:MetaspaceSize

-XX:MaxMetaspaceSize

-XX:+UseParallelGC

-XX:+UseParallelOldGC

-XX:+HeapDumpOnOutOfMemoryError

-XX:+PrintGCTimeStamps

-XX:+PrintGCDateStamps

-XX:+UseConcMarkSweepGC

-XX:-DisableExplicitGC

禁止调用System.gc();但jvm的gc仍然有效

-XX:+MaxFDLimit

最大化文件描述符的数量限制

-XX:+ScavengeBeforeFullGC

新生代GC优先于Full GC执行

-XX:+UseGCOverheadLimit

在抛出OOM之前限制jvm耗费在GC上的时间比例

-XX:-UseConcMarkSweepGC

对老生代采用并发标记交换算法进行GC

-XX:-UseParallelGC

启用并行GC

-XX:-UseParallelOldGC

对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用

-XX:-UseSerialGC

启用串行GC

-XX:+UseThreadPriorities

启用本地线程优先级

-XX:LargePageSizeInBytes=4m

设置用于Java堆的大页面尺寸

-XX:MaxHeapFreeRatio=70描述

GC后java堆中空闲量占的最大比例

-XX:MinHeapFreeRatio=40

GC后java堆中空闲量占的最小比例

-XX:NewRatio=2

新生代内存容量与老生代内存容量的比例

-XX:ReservedCodeCacheSize=32m

保留代码占用的内存容量

-XX:ThreadStackSize=512

设置线程栈大小,若为0则使用系统默认值

-XX:+UseLargePages

使用大页面内存

-XX:HeapDumpPath=./java_pid.hprof

指定导出堆信息时的路径或文件名

-XX:-HeapDumpOnOutOfMemoryError

当首次遭遇OOM时导出此时堆中相关信息

-XX:-PrintConcurrentLocks

遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同

-XX:-TraceClassLoading

跟踪类的加载信息

-XX:OnError=";"

出现致命ERROR之后运行自定义命令

参考文档

JVM虚拟机参数查询
java–jvm启动的参数
Java运行参数设置
JVM参数配置详解(包含JDK1.8)
《深入理解Java虚拟机_第2版》3.5.9 垃圾收集器参数总结

你可能感兴趣的:(Java)