0
点赞
收藏
分享

微信扫一扫

二十四、JVM-运行时参数(基础篇)

Go_Viola 2023-05-18 阅读 109

一、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

570.png 571.png 572.png

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区域中占用空间的期望比例

3、方法区

4、直接内存

3、OutOfMemory相关的选项

4、GC日志相关选项

5、其他参数

举报

相关推荐

0 条评论