1. Java命令概述
- 安装JDK时,会使用
java -version
查看JDK版本,并验证安装是否成功 - 直接输入
java
,会给出java命令的使用说明 -
-options
:可选,java命令的命令行选项,多个选项使用空格分隔 -
class
:要启动的类的名称,要求得是类的完全限定名,也就是包名 + 类名,例如:com.sunrise.Hello
jarfile
:通过-jar
选项,指定要调用的jar(Java Archive,JAR)文件的名称。
- jar文件中包含字节码文件和资源文件,其启动类由
META-INF/MANIFEST.MF
文件中Main-Class
定义 - 一个真实的MANIFEST.MF文件内容如下,该jar包的启动类为
com.sunrise.Hello
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: sunrise
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_192
Main-Class: com.sunrise.Hello
- 通过maven打包生成jar文件时,指定启动类
-
args ...
:传递给main方法参数,使用空格分隔 - Java应用程序的启动:
- java命令将启动一个Java运行时环境(Java Runtime Environment ,JRE),加载class或者jar文件中的字节码文件,并调用启动类中的main()方法,从而完成Java应用程序的启动
- 其中,main()方法要求是
plublic static
的,无返回值,并接受String数组
作为入参。args传递的参数,就是String数组的元素
public static void main(String[] args)
- JavaFX应用程序的启动稍微有点不同:
- 其启动类可以是包含main()方法的普通类,还可以是继承了
javafx.application.Application
的类; - 如果是第二种情况,启动器将会创建一个Application实例,调用该实例的
init()
方法,然后调用start(javafx.stage.Stage)
方法,以完成应用程序的启动
2. options概述
2.1 options分类
- 注意: 本文将基于JDK 8的官方文档,辅以其他的版本或者JVM实现的官网文档,学习java命令中的options
- java命令支持的options范围非常广,按照不同JVM实现对选项的支持度以及选项的使用场景,JDK 8官方文档将options划分为三大类:
- 从描述可以看出,JDK 8官方文档对options的介绍,是基于HotSpot VM
2.2 过时/废弃的options
- 之前版本的JDK中支持的选项,在当前版本中可能不建议使用,甚至被移除
- 可以查阅官方文档了解详情
- JDK 8的官方文档:Deprecated and Removed Options
- JDK 9的官方文档:Obsolete Java Options、Deprecated Java Options、Removed Java Options
2.3 其他小知识
2.3.1 boolean类型的选项:+/-,开启/关闭选项
- 有些选项是boolean类型,使用时需要将默认关闭的选项开启,或将默认开启的选项关闭
- 这样的选项不需要参数作为选项值,而是直接使用
+
开启选项、-
关闭选项。 - 对于高级选项,
-XX:+OptionName
表示开启选项,-XX:-OptionName
表示关闭选项 - 例如,在应用程序OOM时产生dump文件的HeapDumpOnOutOfMemoryError选项,就是一个boolean选项。
- 其默认处于关闭状态,即
-XX:-HeapDumpOnOutOfMemoryError
。 - 要想开启该选项,在java命令中设置
-XX:+HeapDumpOnOutOfMemoryError
即可
2.3.2 选项与参数的分隔符
- 有些选项需要一个参数,用于设定选项的值
- 参数与选项名(OptionName)之间,有分隔符做隔离,甚至没有分隔符
- 可以使用
空格
进行分隔,如-jar filename
- 可以使用
:
进行分隔。例如,-Xloggc:filename
,指定gc日志的文件名;-version:release
,指定运行应用程序的JDK的release版本 - 可以使用
=
进行分隔。例如,-XX:HeapDumpPath=path_of_the_dump_file
,指定OOM时dump文件的路径 - 还可以直接在选项名后面跟上参数。例如,
-Xmxsize
指定堆的最大内存,-Xmssize
指定堆的初始化(最小)内存size
- 选项与参数之间如何分隔,由每个选项的语法决定,使用时多查阅资料、多分类记忆即可
2.3.3 DataSize的单位、比值的表示等
DataSize的单位
- 某些选项需要指定data size,一般是内存大小,例如-Xmx、-Xms、-Xmn等
- 如果以byte为单位,则可以不给出单位后缀,只指定数值
- 如果以KB为单位,则需要以
k
或K
为单位后缀 - 如果以MB为单位,则需要以
m
或M
为单位后缀 - 如果以GB为单位,则需要以
g
或G
为单位后缀 - 例如,指定堆的最大内存为8GB,其不同单位的写法如下:
-Xmx8589934592
-Xmx8388608k 或 -Xmx8388608K
-Xmx8192m 或 -Xmx8192M
-Xmx8g 或 -Xmx8G
带比例的值
- 官方文档中,有这样的一句话:
If you are expected to specify the percentage, then use a number from 0 to 1. For example, specify 0.25 for 25%.
- 但是,从笔者的已知的关于ratio的配置方式来说,有两种ratio的配置方式
- 一是,使用0 ~ 100,表示0% ~ 100%
- 例如,
-XX:MaxHeapFreeRatio=percent
选项,其默认值为70%,即-XX:MaxHeapFreeRatio=70
。 - 二是,给出相对比例
- 例如,有名的
-XX:SurvivorRatio=ratio
,默认值为8,即-XX:SurvivorRatio=8
。表示新生代中,eden : survivor = 8 : 1,由于survivor区有两个,整个新生代被划分为10份,survivor占整个新生代大小的1/10 - survivor和eden的计算公式,总结如下(Y表示新生代的大小)
Eden = (R * Y) / (R + 1 + 1)
From = Y / (R + 1 + 1)
To = Y / (R + 1 + 1)
相对比例是如何计算的?
- 初次接触这种相对比列的选项时,不太能理解是如何计算的
- 以
-XX:SurvivorRatio
选项为例,明明指定的是8,意思是survivor占整个新生代的8份,两个survivor那就是16份? - 然后,问题来了:eden该占据多少份呢?总不可能是是1份吧,这样eden就比survivor还小了,不科学啊 😂 😂 😂
- 所以,还是按照官方解释来计算survivor的大小更为合理:8表示eden : survivor = 8 : 1,这样整个新生代的划分就十分明了,eden占据 8/10,survivor占据1/10
3. 常见的options介绍
3.1 标准options
- 常见的标准options,可以参考JDK官方文档,下面给出一些常见的标准options
- -help 或 -?:展示java命令的使用信息,也就常说的查看命令帮助
- -Dproperty=value:设置系统属性的值。
- 属性名property是不包含空格的字符串;
- 属性值value是可以包含空格的字符串,包含空格时需要使用双引号(
" "
)引住 - 示例:
-Dinput.files="file1 file2 file3"
- -jar filename:执行jar包中的应用程序,要求jar包的MANIFEST.MF文件中,使用Main-Class指定了启动类
- -verbose:class、-verbose:gc、-verbose:jni:展示每个加载的类、每次gc事件、Java本地方法和其他Java Native Interface(JNI)的详细信息
- -showversion:显示版本信息,并继续执行应用程序。
- 常用的 -version ,会在展示完版本信息后退,如果不瞒着出
- 可以说,-showversion 和 -version 选项是等价的,区别在于后续是否会退出
- -version:release:指定运行应用程序的release version,如果调用的
java
命令版本不满足要求,并在系统上找到了一个合适实现,则会使用该合适的实现
- 多了一个release信息,就与常见的**-showversion和-version**作用截然不同了
- release信息的书写规则:
1.x.0_u
,其中x
为主版本号,u
为更新版本号 - 其中,可以使用
空格
表示OR,使用&
表示AND,使用+
表示此版本或更高版本,具体可以参考JDK官方文档 - 示例:
-version:"1.6.0_13 1.6* & 1.6.0_10+"
,要求使用JRE 6u13(1.6.0_13)或者任何从从6u10(1.6.0_10+)开始的JRE 6(1.6*)
3.2 非标准options
- -X: 用于查看java命令支持的所有非标准options
- -Xloggc:filename:将详细的gc事件信息重定向到文件以进行日志记录
- gc日志与 -verbose:gc 的输出相似,之后的gc事件将包含一个elapsed time,这个time是相对第一个gc事件而言
- 如果同时指定 -Xloggc:filename 和 -verbose:gc,则前者将会覆盖后者
- -Xmnsize:设置堆中新生代的初始和max大小
- -Xmnsize设置新生代的初始和max大小,也就是说它同时设置了新生代最小值和最大值。
- 而在某些场景下,最小值和最大值是不相等的。这时,可以使用 -XX:NewSize 设置新生代的min和初始化大小,-XX:MaxNewSize 设置新生代的max大小
- 关于新生代的大小
- 新生代用于放置
新
对象,是gc的主要的区域。新生代设置得过小,则会频繁的minor gc以回收新生代的内存 - 新生代设置得过大,大量对象在gc时容易晋升到老年代,最终导致Full GC。Full GC的代价非常高,不建议触发Full GC
- 因此,Oracle建议将新生代设置为整个堆的1/4 ~ 1/2比较合适
- -Xmssize: 设置堆的min和初始大小,必须为1024 bytes的倍数,且超过
1 MB
- 若不设置**-Xmssize**,则堆的初始大小将是新生代和老年代的总和
- 高级选项**-XX:InitalHeapSize也可以用于设置堆的初始大小,如果-Xms后紧跟-XX:InitalHeapSize**,则堆的初始大小将由**-XX:InitalHeapSize**决定
- -Xmxsize:设置堆的max大小,必须为1024 bytes的倍数,且超过
2 MB
- 对于服务器类型的应用,-Xms和**-Xmx**通常设置为相同的值
- -Xsssize:设置线程堆栈的大小,与高级选项**-XX:ThreadStackSize**等价
3.3 Advanced Runtime Options
- -XX:ErrorFile=filename:指定文件路径和文件名,当程序发生不可恢复的错误时,错误数据将写入该文件
- 默认情况下,error数据的写入路径是应用程序的working directoy,文件名为
hs_err_pid%p.log
。其中,%p
表示应用程序的进程号 - 如果因为权限问题、磁盘空间不足等原因,指定的目录无法写入文件,则会将错误数据写入临时目录
- PS: 笔者之前有遇到过
hs_err_pid%p.log
文件,并未引起关注,这次的学习算是给笔者提了个醒
- -XX:OnError=string:指定程序发行不可恢复的错误时,需要执行的自定义命令
- 多个命令之间使用分号
;
分隔;若包含空格,需要使用双引号" "
- -XX:OnOutOfMemoryError=string:指定程序发生OutOfMemoryError异常时,需要指定的自定义命令
- 书写语法与 -XX:OnError=string 一致,是JVM配置中,常用的一个选项
- -XX:MaxDirectMemorySize=size:设置New I/O的direct-buffer的max总大小
3.4 Advanced Serviceability Options
3.4.1 与OOM有关的选项
- -XX:+HeapDumpOnOutOfMemoryError:程序OOM时,使用堆分析器(heap profiler,HPROF)将堆转储到文件中
- 该选项默认处于
关闭
状态,即-XX:-HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=path:指定堆转储的路径和文件名
- 默认在working directory,创建一个名为
java_pid%p.hprof
的文件
- 可能是因为只展示常用的选项,JDK 8的官方文档中,并未提及选项 -XX:+|-ExitOnOutOfMemoryError 和 -XX:+|-CrashOnOutOfMemoryError
- -XX:+ExitOnOutOfMemoryError:程序发生OOM时,JVM将退出
- 默认为disable状态,即
-XX:-ExitOnOutOfMemoryError
- -XX:+CrashOnOutOfMemoryError:程序发生OOM时,JVM崩溃并产生text和binary类型的crash文件
- text类型的crash文件,以
.dump
为扩展类型;binary类型的扩展文件,在Linux中以.core
为扩展类型,在Windows中,以.mdp
为后缀 - 默认为disable状态,即
-XX:-CrashOnOutOfMemoryError
3.4.2 -XX:+ExitOnOutOfMemoryError VS -XX:+CrashOnOutOfMemoryError
- 使用如下代码触发OOM
package internet.gc;
public class GcTest {
private final static int MB = 1024 * 1024;
private final static int LEN = 12;
public static void main(String[] args) {
byte[][] buffer= new byte[LEN][];
for (int i = 0; i < LEN; i++) {
buffer[i] = new byte[1 * MB];
}
System.out.println("成功初始化byte数组");
}
}
- IDEA运行时,设置VM参数如下,开启ExitOnOutOfMemoryError选项
-Xms10M -Xmx10M -XX:+ExitOnOutOfMemoryError -XX:-CrashOnOutOfMemoryError
- 程序运行起来后打印了如下信息,除此之外并未生成其他文件
Terminating due to java.lang.OutOfMemoryError: Java heap space
- 更新VM参数,开启CrashOnOutOfMemoryError选项
-Xms10M -Xmx10M -XX:-ExitOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError
- 程序运行起来后,打印了如下信息:
Aborting due to java.lang.OutOfMemoryError: Java heap space
#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (debug.cpp:308), pid=52754, tid=0x0000000000002503
# fatal error: OutOfMemory encountered: Java heap space
#
# JRE version: Java(TM) SE Runtime Environment (8.0_192-b12) (build 1.8.0_192-b12)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode bsd-amd64 compressed oops)
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/xxx/IdeaProjects/antlr4/hs_err_pid52754.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
- 从提示信息可知,生成了error文件
hs_err_pid52754.log
,其中52754是程序的pid。 - 由于系统权限限制,并未生成前面提到的text和binary类型的crash文件,需要使用
ulimit -c unlimited
命令进行处理 - 而笔者使用的用户名,无权限执行该命令,因此无法观察text和binary类型的crash文件,后续若有机会将会进行补充
- 总结:
- 当程序OOM时,-XX:+ExitOnOutOfMemoryError只会打印一个简略的提示信息,并不会产生text/binary类型的crash文件
- 而-XX:+CrashOnOutOfMemoryError,不仅会产生text/binary类型的crash文件的binary文件,还会产生一个error文件
- 猜测: crash是一种非正常的JVM退出方式,JVM会认为程序出现了不可恢复的错误,因此会产生error文件
- -XX:+CrashOnOutOfMemoryError产生text/binary类型的crash文件,需要一定的系统权限,可以使用
ulimit -c unlimited
命令开启权限 - 有博客说,error文件的内容非常简单,不足以定位OOM的原因,如果想让程序在OOM时快速退出,选择-XX:+ExitOnOutOfMemoryError更为适合
3.5 Advanced Garbage Collection Options
- 选择使用何种垃圾回收器的选项,例如(有省略):
- -XX:+UseConcMarkSweepGC使用CMS垃圾回收器
- -XX:+UseG1GC使用G1垃圾回收器
- -XX:+UseParallelGC使用并行的垃圾回收器,新生代使用Parallel Scavenge,老年代使用Parallel Old,是JDK 8默认的垃圾回收器 (JDK8默认垃圾回收器详解)
- -XX:+UseSerialGC使用并行垃圾回收器
- 设置堆、堆中各代的大小的选项,例如(有省略):
- -XX:NewRatio=ratio:新生代与老年代的比例,默认值为2,即新生代 : 老年代 = 1 : 2
- -XX:InitialHeapSize=size
- 与特定的垃圾回收器有关的选项,例如与G1有关的选项(有省略):
- -XX:G1HeapRegionSize=size:G1的regions大小,1MB ~ 32 MB。若不设置region大小,则基于最小的堆size,将其划分为2048个左右的region,从而得到region大小
- -XX:InitiatingHeapOccupancyPercent=percent:当堆内存使用量达到percent,将触发G1的并发标记周期。
- 值为0 ~ 100,默认值为45,即当堆内存使用量到达45%时,开启并发标记周期
4. 实用小技巧(不断更新)
4.1 如何查看advaned options?
- 前面的内容中,如何查看java命令中的各种选项,值得引起我们的关注
- 查看jvm标准选项,可以使用如下命令
java 或者 java -help 或者 java -? # 其中-?与-help同义
- 查看jvm非标准选项,可以使用如下命令
java -X
- 但是,如何查看数量庞大的高级选项却并未提及
- 本小节,将关注如何查看jvm的高级选项(以-XX开头的选项)
4.1.1 查看-XX选项的默认值
- 使用
-XX:+PrintFlagsInitial
选项,可以打印所有-XX选项的默认值
java -XX:+PrintFlagsInitial
- 部分打印结果选取如下,第一列:选项的数据类型,第二列:选项名,第四列:选项的默认值,第五列:选项的类别
intx OnStackReplacePercentage = 140 {pd product}
bool LazyBootClassLoader = true {product}
uintx InitialHeapSize = 0 {product}
4.1.2 查看-XX选项的实际值
- 基于长期的观察,JVM一般会将某些选项的值更新为一个合适的初始值。例如,JDK 8中,新生代大小为
-XX:NewSize
被更新为89128960(85MB),而非默认值1363144 - 在JDK官网中,这种根据观察设置初始值的行为,被叫做
ergonomics
- 此时,可以使用
-XX:+PrintFlagsFinal
查看-XX选项的实际值
# 如何不指定-version,会打印所有的标准option,影响数据的查看
java -XX:+PrintFlagsFinal -version
# 也可以指定某个Java类,这样会先打印高级选项,再执行Java应用程序
java -cp ./target/classes -XX:+PrintFlagsFinal com.sunrise.jvm.GcTest
- 为了表示该选项已经被JVM ergonomics或用户设置,
-XX:+PrintFlagsFinal
选项将在第三列的赋值符号(=
)上做文章,使用:=
表示该选项已经被更新过
uintx MaxHeapFreeRatio = 100 {manageable}
uintx MaxHeapSize := 4294967296 {product}
4.1.3 查看隐藏选项的实际值
- JVM中有些选项,还处于实验阶段,并未正式对外开放,因此会将其隐藏起来
- 例如,G1中的
-XX:G1NewSizePercent=5
和-XX:G1MaxNewSizePercent=60
,想要更改这两个选项的默认值,需要使用-XX:+UnlockExperimentalVMOptions
进行解锁
java -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=10 -XX:G1MaxNewSizePercent=75 G1test.jar
- 因此,如果想要查看隐藏选项的实际值,可以使用如下命令
java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
- 加上这两个解锁隐藏选项的参数后,打印出的选项个数从 731上涨为877
4.1.4 查看被设置了值的选项(CommandLine Flags)
-XX:+PrintFlagsFinal
既打印了未被设置值的选项,还打印了被用户或JVM ergonomics设置值的选项- 有时,我们只需要查看哪些选项被设置了值。这时,可以使用
-XX:+PrintCommandLineFlags
打印被设置了值的选项
java -XX:+PrintCommandLineFlags -version
# 或者
java -cp ./target/classes -XX:+PrintCommandLineFlags com.sunrise.jvm.GcTest
- 最终,都将打印如下信息,可见JDK 8为堆大小、垃圾回收器等设置了一个合适的值,而非使用默认值
-XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
4.1.5 gc日志中,自动打印CommandLine Flags
- 最开始,笔者想在执行应用程序时,打印出用户或JVM ergonomics设置过的CommandLine Flags
- 整个java命令如下:
# 设置堆的初始和最大size位10MB,程序运行起来后,将触发OOM
# 打印用户或JVM ergonomics设置过的CommandLine Flags
# 将详细的gc日志(包含时间戳)重定向到gc.log中
java -cp ./target/classes -Xms10M -Xmx10M -XX:+PrintCommandLineFlags -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gc.log com.sunrise.jvm.GcTest
- 最终,执行结果如下,并生成了gc.log
- gc.log的内容如下,可以发现gc.log中,打印了一些与jdk、执行环境等有关的信息,还打印了CommandLine flags,以及gc事件的详情
Java HotSpot(TM) 64-Bit Server VM (25.192-b12) for bsd-amd64 JRE (1.8.0_192-b12), built on Oct 6 2018 09:36:52 by "java_re" with gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Memory: 4k page, physical 16777216k(19984k free)
/proc/meminfo:
CommandLine flags: -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
2022-11-13T13:27:03.348-0800: 0.108: [GC (Allocation Failure) --[PSYoungGen: 1466K->1466K(2560K)] 7610K->7610K(9728K), 0.0048048 secs] [Times: user=0.01 sys=0.01, real=0.01 secs]
2022-11-13T13:27:03.353-0800: 0.113: [Full GC (Ergonomics) [PSYoungGen: 1466K->1288K(2560K)] [ParOldGen: 6144K->6144K(7168K)] 7610K->7432K(9728K), [Metaspace: 2475K->2475K(1056768K)], 0.0024963 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
2022-11-13T13:27:03.355-0800: 0.116: [GC (Allocation Failure) --[PSYoungGen: 1288K->1288K(2560K)] 7432K->7440K(9728K), 0.0005330 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2022-11-13T13:27:03.356-0800: 0.116: [Full GC (Allocation Failure) [PSYoungGen: 1288K->1276K(2560K)] [ParOldGen: 6152K->6144K(7168K)] 7440K->7420K(9728K), [Metaspace: 2475K->2475K(1056768K)], 0.0018582 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
PSYoungGen total 2560K, used 1358K [0x00000007bfd00000, 0x00000007c0000000, 0x00000007c0000000)
eden space 2048K, 66% used [0x00000007bfd00000,0x00000007bfe53bb8,0x00000007bff00000)
from space 512K, 0% used [0x00000007bff80000,0x00000007bff80000,0x00000007c0000000)
to space 512K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007bff80000)
ParOldGen total 7168K, used 6144K [0x00000007bf600000, 0x00000007bfd00000, 0x00000007bfd00000)
object space 7168K, 85% used [0x00000007bf600000,0x00000007bfc000e8,0x00000007bfd00000)
Metaspace used 2506K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 269K, capacity 386K, committed 512K, reserved 1048576K
- 从执行结果和gc日志不难发现:
- 使用
-XX:+PrintGCDetails
会打印很多额外的信息(JDK版本、执行环境、CommandLine Flags)等,可以不用额外指定-XX:+PrintCommandLineFlags
- 默认值为false,未显式指定却出现的
-XX:+PrintGCTimeStamps
选项,猜测:-XX:+PrintGCDateStamps
一旦指定,-XX:+PrintGCTimeStamps
也会被指定 - 默认值为false,未显式指定却出现的
-XX:+PrintGC
选项,猜测:-XX:+PrintGCDetails
一旦指定,-XX:+PrintGC
也会被指定
4.2 如何查看已运行程序的CommandLine Flags
4.2.1 jps命令
- jps命令加上
-v
选项,可以打印启动应用程序时的CommandLine Flags
jps -v
- 例如,查看Presto服务启动时的CommandLine Flags
jps -v | grep "PrestoServer"
- 执行结果如下:
4.2.2 jinfo命令
- 如下的
jinfo
命令,可以查看所有CommandLine Flags
jinfo -flags pid
- 基于上面的Presto服务,进程号为100656,通过jinfo查看其CommandLine Flags
- 同时,还可以查看指定的flag的值。注意: 需要切换到启动该应用程序的用户,否则会报错:
pid: Unable to open socket file: target process not responding or HotSpot VM not loaded
jinfo -flag option_name pid
- 该Presto服务使用G1垃圾回收器,查看选项
UseG1GC
的结果如下: - 除此之外,jinfo命令还可以动态修改option的值
jinfo -flag [+|-]name pid # 动态修改boolean类型的option的值
jinfo -flag <name>=<value> pid # 动态修改option的值
4.3 参考链接
- Useful JVM Flags – Part 3 (Printing all XX Flags and their Values)
- 中文译翻译:JVM实用参数(三)打印所有XX参数及值
- 查看JVM运行参数jinfo命令
- JVM - 列出JVM默认参数及运行时生效参数
5. 附录
- JDK 8的官方文档:Java Options
- JDK 9的官方文档:Java Options
- 官方最新的options介绍文档(笔者认为这是最新的 ):JRockit JVM Command-Line Options,其中 -XX Command-Line Options较为全面的介绍了-XX选项
- JDK 10的options介绍文档:Java Platform, Standard Edition JRockit to HotSpot Migration Guide