JVM 参数类型

JVM的参数类型分为 3 大类:

  • 标准参数
  • X 参数:非标准化参数
  • XX 参数:非标准化参数,主要用于 JVM 调优和 Debug

标准参数

在 JVM 各个版本中基本上不变,相对稳定

  • -help
  • -server -client
  • -version -showversion
  • -cp -classpath

    X 参数

    ```shell

    默认是使用 mixed 模式

    $ java -version Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 java version “1.8.0_45” Java(TM) SE Runtime Environment (build 1.8.0_45-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

指定使用 -Xcomp ,输出的是:compiled mode

$ java -Xcomp -version Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 java version “1.8.0_45” Java(TM) SE Runtime Environment (build 1.8.0_45-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, compiled mode)

指定使用 -Xint 看到输出的是:interpreted mode

$ java -Xint -version Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 java version “1.8.0_45” Java(TM) SE Runtime Environment (build 1.8.0_45-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, interpreted mode)

  1. <a name="JhzwX"></a>
  2. ### XX 参数
  3. 非标准化参数、相对不稳定、主要用于 JVM 调优和 Debug
  4. - Boolean 类型
  5. 格式:-XX:[+-]<name> 表示启用或禁用 name 属性,+ 号表示启用<br />例如:
  6. ```shell
  7. -XX:+UseConcMarkSweepGC
  8. -XX:+UseG1GC
  • 非 Boolean 类型

格式:-XX:<name>=<value> 表示 name 属性的值是 value
例如:

  1. -XX:MaxGCPauseMillis=500
  2. XX:GCTimeRatio=19

但是有缩写版本的参数,看上去很像是 X 参数,其实是 XX 参数。比如

  • -Xmx :最大堆内存 对应的 XX 参数是 -XX:InitialHeapSize
  • -Xms:初始化堆大小 对应的 XX 参数是 -XX:MaxHeapSize

    查看运行时 JVM 参数

  • -XX:+PrintFlagsInitial:查看初始值

  • -XX:+PrintFlagsFinal:查看最终的值一般都有一个默认值,可以通过命令行等配置方式覆盖掉这个默认值,这里查看的则是这个最终的值
  • -XX:+UnlockExperimentaIVMOptions:解锁实验参数

JVM 中有一部分参数是无法直接赋值的,需要加该参数,解锁实验参数,才能配置

  • -XX:UnlockDiagnosticVMOpeions:解锁诊断参数
  • -XX:+PrintCommandLineFlags:打印命令行参数
  1. $ java -XX:+PrintFlagsInitial -version
  2. [Global flags]
  3. intx ActiveProcessorCount = -1 uintx
  4. MaxHeapSize := 4294967296 {product}
  5. bool UseThreadPriorities = true {pd product}
  6. bool UseTypeProfile = true {product}
  7. bool UseTypeSpeculation = true {C2 product}

:::info 注:
= 表示默认值
:= 表示被用户或则 JVM 修改后的值
这个命令查看的是当前运行这个命令的进程java -XX:+PrintFlagsInitial -version 的值,运行这一条,也会去启动一个 java 进程,那么打印的参数则是这个进程的参数。
如何查看一个正在运行的 JVM 进程参数,是后面课程要讲解的。 :::