一、JVM 参数选项
官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
1、类型一:标准参数选项
> java -help
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
其中选项包括:
-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。
Server模式和Client模式
- Hotspot JVM有两种模式,分别是server和client,分别通过-server和-client模式设置
- 32位系统上,默认使用Client类型的JVM。要想使用Server模式,机器配置至少有2个以上的CPU和2G以上的物理内存。client模式适用于对内存要求较小的桌面应用程序,默认使用Serial串行垃圾收集器
- 64位系统上,只支持server模式的JVM,适用于需要大内存的应用程序,默认使用并行垃圾收集器
- 官网地址:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html 如何知道系统默认使用的是那种模式呢?
- 通过java -version命令:可以看到Server VM字样,代表当前系统使用是Server模式
> java -version
java version 1.8.0_201
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
2、类型二:-X参数选项
> 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:all
显示所有设置并继续
-XshowSettings:vm 显示所有与 vm 相关的设置并继续
-XshowSettings:properties
显示所有属性设置并继续
-XshowSettings:locale
显示所有与区域设置相关的设置并继续
-X 选项是非标准选项, 如有更改, 恕不另行通知。
- 如何知道JVM默认使用的是混合模式呢?
- 同样地,通过java -version命令:可以看到 mixed mode 字样,代表当前系统使用的是混合模式
1、JVM的JIT编译模式相关的选项
-Xint:
禁用JIT,所有字节码都被解释执行,这个模式的速度是最慢的-Xcomp:
所有字节码第一次使用就都被编译成本地代码,然后再执行-Xmixed:
混合模式,默认模式,刚开始的时候使用解释器慢慢解释执行,后来让JIT即时编译器根据程序运行的情况,有选择地将某些热点代码提前编译并缓存在本地,在执行的时候效率就非常高了
2、-Xmx -Xms -Xss属于XX参数吗
-Xms<size>:
设置初始Java堆大小,等价于-XX:InitialHeapSize
-Xmx<size>:
设置最大Java堆大小,等价于-XX:MaxHeapSize
-Xss<size>:
设置Java线程堆栈大小,等价于-XX:ThreadStackSize
3、类型三:-XX参数选项
1、特点
- 非标准化参数
- 使用的最多的参数类型
- 这类选项属于实验性,不稳定
- 以-XX开头
2、作用
用于开发和调试JVM
3、分类
1、Boolean类型格式
-XX:+<option>
表示启用option属性
-XX:-<option>
表示禁用option属性
举例:
-XX:-UseParallelGC
选择垃圾收集器为并行收集器
-XX:+UseG1GC
表示启用G1收集器
-XX:+UseAdaptiveSizePolicy
自动选择年轻代区大小和相应的Servivor区比例
说明:因为有的指令默认是开启的,所以可以使用-关闭
2、非Boolean类型格式(key-value类型)
子类型1:数值型格式-XX:<option>=<number>
number表示数值,number可以带上单位,比如:'m'、'M'表示兆,'k','K'表示kb,'g','G'表示g(例如32K跟32768是一样的效果)
例如:
-XX:NewSize=1024m
表示设置新生代初始大小为1024兆
-XX:MaxGCPauseMillis=500
表示GC停顿时间500ms
-XX:GCTimeRatio=19
表示设置吞吐量
-XX:NewRatio=2
表示新生代与老年代的比例
子类型2:非数值型格式-XX:<name>=<string>
-XX:HeapDumpPath=/usr/local/heapdump.hprof
用来指定heap转存文件的存储路径
4、特别的
-XX:+PrintFlagsFinal:
- 输出所有参数的名称和默认值
- 默认不包括Diagnostic和Experimental的参数
- 可以配合-XX:+UnlockDiagnosticVMOptions和-XX:UnlockExperimentalVMOptions使用
二、添加JVM参数选项
1、IEDA
2、运行jar包
java -Xms50m -Xmx50m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -jar demo.jar
3、通过Tomcat运行war包
Linux系统下可以在tomcat/bin/catalina.sh中添加类似如下配置: JAVA_OPTS="-Xms512M -Xmx1024M" Windows系统下载catalina.bat中添加类似如下配置: set "JAVA_OPTS=-Xms512M -Xmx1024M"
4、程序运行过程中
使用jinfo -flag <name>=<value> <pid>设置非Boolean类型参数 使用jinfo -flag [+|-]<name> <pid>设置Boolean类型参数
三、常用的JVM参数选项
1、打印设置的XX选项及值
-XX:+PrintCommandLineFlags
:可以让程序运行前打印出用户手动设置或者JVM自动设置的XX选项
-XX:+PrintFlagsInitial
:表示打印出所有XX选项的默认值
-XX:+PrintFlagsFinal
:表示打印出XX选项在运行程序时生效的值
-XX:+PrintVMOptions
:打印JVM的参数
2、堆、栈、方法区等内存大小设置
1、栈
-Xss128k
:等价于-XX:ThreadStackSize,设置每个线程的栈大小为128k
2、堆内存
-Xms3550m
:等价于-XX:InitialHeapSize,设置JVM初始堆内存为3500M
-Xmx3550m
:等价于-XX:MaxHeapSize,设置JVM最大堆内存为3500M
-Xmn2g
:设置年轻代大小为2G,即等价于-XX:NewSize=2g -XX:MaxNewSize=2g,也就是设置年轻代初始值和年轻代最大值都是2G,官方推荐配置为整个堆大小的3/8
-XX:NewSize=1024m
:设置年轻代初始值为1024M
-XX:MaxNewSize=1024m
:设置年轻代最大值为1024M
-XX:SurvivorRatio=8
:设置年轻代中Eden区与一个Survivor区的比值,默认为8
-XX:+UseAdaptiveSizePolicy
:自动选择各区大小比例,默认开启
-XX:NewRatio=2
:设置老年代与年轻代(包括1个Eden区和2个Survivor区)的比值,默认为2
-XX:PretenureSizeThreadshold=1024
:设置让大于此阈值的对象直接分配在老年代,单位为字节,只对Serial、ParNew收集器有效
-XX:MaxTenuringThreshold=15
:默认值为15,新生代每次MinorGC后,还存活的对象年龄+1,当对象的年龄大于设置的这个值时就进入老年代
-XX:+PrintTenuringDistribution
:让JVM在每次MinorGC后打印出当前使用的Survivor中对象的年龄分布
-XX:TargetSurvivorRatio
:表示MinorGC结束后Survivor区域中占用空间的期望比例