JVM 命令行参数解析

本贴最后更新于 2313 天前,其中的信息可能已经时过境迁

1. java 命令行参数

  • 先看 java 命令行的参数
solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$ java
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
where options include:
    -d32	  use a 32-bit data model if available
    -d64	  use a 64-bit data model if available
    -server	  to select the "server" VM
    -zero	  to select the "zero" VM
    -dcevm	  to select the "dcevm" VM
                  The default VM is server,
                  because you are running on a server-class machine.


    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -D<name>=<value>
                  set a system property
    -verbose:[class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  require the specified version to run
    -showversion  print product version and continue
    -jre-restrict-search | -no-jre-restrict-search
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  include/exclude user private JREs in the version search
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                  see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.
solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$ java -version
openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-8u141-b15-1~deb9u1-b15)
OpenJDK 64-Bit Server VM (build 25.141-b15, mixed mode)
solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$
  • 看一个实际运行的 java 命令:
solr@2f1fe8cc9f09:/opt/solr/server/solr-webapp/webapp$ ps aux | grep java
solr         1  0.2 13.3 3060500 272904 ?      Ssl  Oct08  44:03 /docker-java-home/jre/bin/java -server -Xms512m -Xmx512m -XX:NewRatio=3 -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ConcGCThreads=4 -XX:ParallelGCThreads=4 -XX:+CMSScavengeBeforeRemark -XX:PretenureSizeThreshold=64m -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=50 -XX:CMSMaxAbortablePrecleanTime=6000 -XX:+CMSParallelRemarkEnabled -XX:+ParallelRefProcEnabled -XX:-OmitStackTraceInFastThrow -verbose:gc -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/opt/solr/server/logs/solr_gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=9 -XX:GCLogFileSize=20M -Dsolr.log.dir=/opt/solr/server/logs -Djetty.port=8983 -DSTOP.PORT=7983 -DSTOP.KEY=solrrocks -Duser.timezone=UTC -Djetty.home=/opt/solr/server -Dsolr.solr.home=/opt/solr/server/solr -Dsolr.install.dir=/opt/solr -Dsun.net.inetaddr.ttl=60 -Dsun.net.inetaddr.negative.ttl=60 -Xss256k -jar start.jar --module=http
  • -Xms512m -Xmx512m
  • -XX:NewRatio=3
    • 用来来指定新生代和整个堆的大小比例,或者直接用–XX:NewSize 来指定所需的新生代空间。如果设置了 NewRatio,那么整个堆空间的 1/(NewRatio +1)就是新生代空间的大小。
    • 使用 CMS 垃圾回收时,需要设置一个充足的新生代空间。然而,当新生代空间的大小超过一个特定的水平,程序的响应能力会被降低。
  • -XX:SurvivorRatio=4
    • Eden 区与 Survivor 区的大小比值。设置为 4,则两个 Survivor 区与一个 Eden 区的比值为 2:4,一个 Survivor 区占整个新生代的 1/6。
    • 参考:JVM 系列三:JVM 参数设置、分析
  • -XX:TargetSurvivorRatio=90
  • -XX:MaxTenuringThreshold=8
    • 设置对象在新生代中最大的存活次数,最大值 15,并行回收机制默认为 15,CMS 默认为 4。每经过一次 YGC,年龄加 1,当 survivor 区的对象年龄达到 TenuringThreshold 时,表示该对象是长存活对象,就会直接晋升到老年代。
    • 如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。该参数只有在串行 GC 时才有效.
  • -XX:+UseConcMarkSweepGC
    • 使用 CMS 内存收集算法
    • 启用 CMS 低停顿垃圾收集器,减少 FGC 的暂停时间
  • -XX:+UseParNewGC
    • 设置新生代为并行收集。可与 CMS 收集同时使用 JDK5.0 以上,JVM 会根据系统配置自行设置,所以无需再设置此值
  • -XX:ConcGCThreads=4
  • -XX:ParallelGCThreads=4
    • 并行收集器的线程数。
    • 此值最好配置与处理器数目相等,同样适用于 CMS
  • -XX:+CMSScavengeBeforeRemark
    • 参考:JVM GC 算法 CMS 详解(转)
    • 在 CMS GC 前启动一次 ygc,目的在于减少 old gen 对 ygc gen 的引用,降低 remark 时的开销-----一般 CMS 的 GC 耗时 80% 都在 remark 阶段
    • 开启-XX:+CMSScavengeBeforeRemark 选项,强制 remark 之前开始一次 minor gc,减少 remark 的暂停时间,但是在 remark 之后也将立即开始又一次 minor gc。
  • -XX:PretenureSizeThreshold=64m
    • 对象超过多大是直接在旧生代分配
    • 单位字节 新生代采用 Parallel Scavenge GC 时无效另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象.
  • -XX:+UseCMSInitiatingOccupancyOnly
    • 命令 JVM 不基于运行时收集的数据来启动 CMS 垃圾收集周期,禁止 hostspot 自行触发 CMS GC。
    • 只有当我们充足的理由(比如测试)并且对应用程序产生的对象的生命周期有深刻的认知时,才应该使用该标志。
  • -XX:CMSInitiatingOccupancyFraction=50
    • 设定 CMS 在对内存占用率达到 50% 的时候开始 GC(因为 CMS 会有浮动垃圾,所以一般都较早启动 GC);
    • 这两个设置一般配合使用,一般用于『降低 CMS GC 频率或者增加频率、减少 GC 时长』的需求;
      • -XX:CMSInitiatingOccupancyFraction=70 是指设定 CMS 在对内存占用率达到 70% 的时候开始 GC(因为 CMS 会有浮动垃圾,所以一般都较早启动 GC);
      • -XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的 70%),如果不指定,JVM 仅在第一次使用设定值,后续则自动调整.
  • -XX:CMSMaxAbortablePrecleanTime=6000
    - 参考:Tenured 区并发垃圾回收器 CMS 介绍
  • -XX:+CMSParallelRemarkEnabled
    • 降低标记停顿
  • -XX:+ParallelRefProcEnabled
    • 参考:一步步优化 JVM 五:优化延迟或者响应时间(3)
    • 这个选项可以用 HotSpot VM 的任何一种垃圾回收器上,他会是用多个的引用处理线程,而不是单个线程。这个选项不会启用多线程运行方法的 finalizer。他会使用很多线程去发现需要排队通知的 finalizable 对象。
  • -XX:-OmitStackTraceInFastThrow
  • -verbose:gc
  • -XX:+PrintHeapAtGC
    • 打印 GC 前后的详细堆栈信息
  • -XX:+PrintGCDetails
    • 需要在生产环境或者压测环境中测量这些参数下系统的表现,这时候需要打开 GC 日志查看具体的信息,因此加上参数:-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/test/logs/gc.log
  • -XX:+PrintGCDateStamps
  • -XX:+PrintGCTimeStamps
  • -XX:+PrintTenuringDistribution
    • 查看每次 minor GC 后新的存活周期的阈值
  • -XX:+PrintGCApplicationStoppedTime
    • 打印垃圾回收期间程序暂停的时间.可与上面混合使用
  • -Xloggc:/opt/solr/server/logs/solr_gc.log
    • 把相关日志信息记录到文件以便分析.与上面几个配合使用
  • -XX:+UseGCLogFileRotation
    • 启用 GC 日志文件的自动转储
  • -XX:NumberOfGCLogFiles=9
    • GC 日志文件的循环数目
  • -XX:GCLogFileSize=20M
    • 控制 GC 日志文件的大小
    • 参考:-xx:+usegclogfilerotation
      • Built-in support for GC log rotation has been added to the HotSpot JVM. It is described in the RFE 6941923 and is available in: Java 6 Update 34 Java 7 Update 2 (but there is no reference to it in these release notes)。
      • There are three new JVM flags that can be used to enable and configure it:
      • -XX:+UseGCLogFileRotation
        must be used with -Xloggc:;
        -XX:NumberOfGCLogFiles=
        must be >=1, default is one;
        -XX:GCLogFileSize=M (or K)
        default will be set to 512K.
  • -Xss256k
    • 每个线程的堆栈大小
    • JDK5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。

1.2 javap 反编译工具

  • 将 class 文件反编译为字节码
  • 使用-XX:+PrintAssembly 参数来输出反汇编

1.3 java 命令行参数使用

  • -XX:+PrintGCDetails,在发生垃圾收集行为的时候打印内存回收日志。
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...