• java命令中的options


    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
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
      • 通过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)
        
        • 1
    • 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

    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
      
      • 1
      • 2
      • 3
      • 4

    带比例的值

    • 官方文档中,有这样的一句话:

      If you are expected to specify the percentage, then use a number from 0 to 1. For example, specify 0.25 for 25%.
      
      • 1
    • 但是,从笔者的已知的关于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)
      
      • 1
      • 2
      • 3

    相对比例是如何计算的?

    • 初次接触这种相对比列的选项时,不太能理解是如何计算的
    • -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数组");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    • IDEA运行时,设置VM参数如下,开启ExitOnOutOfMemoryError选项

      -Xms10M -Xmx10M -XX:+ExitOnOutOfMemoryError -XX:-CrashOnOutOfMemoryError
      
      • 1
    • 程序运行起来后打印了如下信息,除此之外并未生成其他文件

      Terminating due to java.lang.OutOfMemoryError: Java heap space
      
      • 1
    • 更新VM参数,开启CrashOnOutOfMemoryError选项

      -Xms10M -Xmx10M -XX:-ExitOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError
      
      • 1
    • 程序运行起来后,打印了如下信息:

      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
      #
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • 从提示信息可知,生成了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同义
        
        • 1
      • 查看jvm非标准选项,可以使用如下命令

        java -X
        
        • 1
    • 但是,如何查看数量庞大的高级选项却并未提及
    • 本小节,将关注如何查看jvm的高级选项(以-XX开头的选项)

    4.1.1 查看-XX选项的默认值

    • 使用-XX:+PrintFlagsInitial选项,可以打印所有-XX选项的默认值

      java -XX:+PrintFlagsInitial
      
      • 1
    • 部分打印结果选取如下,第一列:选项的数据类型,第二列:选项名,第四列:选项的默认值,第五列:选项的类别

       intx OnStackReplacePercentage                  = 140                                 {pd product}
       bool LazyBootClassLoader                       = true                                {product}
      uintx InitialHeapSize                           = 0                                   {product}
      
      • 1
      • 2
      • 3

    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 
      
      • 1
      • 2
      • 3
      • 4

      在这里插入图片描述

    • 为了表示该选项已经被JVM ergonomics或用户设置,-XX:+PrintFlagsFinal选项将在第三列的赋值符号(=)上做文章,使用:=表示该选项已经被更新过

      uintx MaxHeapFreeRatio                          = 100                                 {manageable}
      uintx MaxHeapSize                              := 4294967296                          {product}
      
      • 1
      • 2

    4.1.3 查看隐藏选项的实际值

    • JVM中有些选项,还处于实验阶段,并未正式对外开放,因此会将其隐藏起来

    • 例如,G1中的-XX:G1NewSizePercent=5-XX:G1MaxNewSizePercent=60,想要更改这两个选项的默认值,需要使用-XX:+UnlockExperimentalVMOptions进行解锁

      java -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=10 -XX:G1MaxNewSizePercent=75 G1test.jar
      
      • 1
    • 因此,如果想要查看隐藏选项的实际值,可以使用如下命令

      java -server -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
      
      • 1
    • 加上这两个解锁隐藏选项的参数后,打印出的选项个数从 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
      
      • 1
      • 2
      • 3
    • 最终,都将打印如下信息,可见JDK 8为堆大小、垃圾回收器等设置了一个合适的值,而非使用默认值

      -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 
      
      • 1

    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 
      
      • 1
      • 2
      • 3
      • 4
    • 最终,执行结果如下,并生成了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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
    • 从执行结果和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
      
      • 1
    • 例如,查看Presto服务启动时的CommandLine Flags

      jps -v | grep "PrestoServer"
      
      • 1
    • 执行结果如下:
      在这里插入图片描述

    4.2.2 jinfo命令

    • 如下的jinfo命令,可以查看所有CommandLine Flags

      jinfo -flags pid
      
      • 1
    • 基于上面的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
      
      • 1
    • 该Presto服务使用G1垃圾回收器,查看选项UseG1GC的结果如下:

    • 除此之外,jinfo命令还可以动态修改option的值

      jinfo -flag [+|-]name pid # 动态修改boolean类型的option的值
      jinfo -flag <name>=<value> pid # 动态修改option的值
      
      • 1
      • 2

    4.3 参考链接

    5. 附录

  • 相关阅读:
    5年专业研究,这份云原生安全指南请查收
    iOS 单元测试
    一文学会shell 脚本编写
    flex设置为1后为什么要设置width为0,和布局超出省略号为什么会超出容器,为什么会没有用
    Netty-1-IO模型
    darknet框架 训练分类模型及测试图片
    Pandas与数据库交互详解
    Linux 文件IO
    Koreographer Professional Edition丨一款Unity音游插件教程
    ISP屏幕和LCD屏幕的区别,以及AMOLED、Super AMOLED和OLED
  • 原文地址:https://blog.csdn.net/u014454538/article/details/127660387