首页 > 编程学习 > java命令中的options

java命令中的options

发布时间:2022/11/13 18:32:27

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文件时,如何指定启动类,可以参考之前的博客:maven入门
  • 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为单位,则需要以kK为单位后缀

  • 如果以MB为单位,则需要以mM为单位后缀

  • 如果以GB为单位,则需要以gG为单位后缀

  • 例如,指定堆的最大内存为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. 附录

  • 官方最新的options介绍文档(笔者认为这是最新的 😂):JRockit JVM Command-Line Options,其中 -XX Command-Line Options较为全面的介绍了-XX选项
  • JDK 10的options介绍文档:Java Platform, Standard Edition JRockit to HotSpot Migration Guide
Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式