JVM常用参数


类型 描述
-Xint X型 解释执行
-Xcomp 编译执行,即第一次使用就先编译成本地代码再执行
-Xmixed 混合模式(默认)
-XX:+属性值 XX型 boolean型 表示开启该属性
-XX:-属性值 表示关闭该属性
-XX:属性key=值value kv设值型 给jvm属性设置具体的值
参数 描述
-XX:PrintFlagsInitial 查看所有参数的默认初始值
-XX:PrintFlagsFinal 查看所有的参数的最终值(可能会存在修改,不再是初始值)
-Xms 初始堆空间内存(默认为物理内存的1/64)
-Xmx 最大堆空间内存(默认为物理内存的1/4)
-Xmn 设置新生代大小(初始值及最大值)
-XX:NewRatio 配置新生代与老年代在堆结构的占比
-XX:SurvivorRatio 设置新生代中Eden和S0/S1空间的比例
-XX:MaxTenuringThreshold 设置新生代垃圾的最大年龄(默认15)
-XX:+PrintGC 打印gc简要信息,或者 -verbose:gc
-XX:+PrintGCDetails 输出详细的GC处理日志
-XX:HandlePromotionFailure 是否设置空间分配担保
jps 查看当前运行中的进程
jinfo -flag SurvivorRatio PID 查看新生代中Eden和S0/S1空间的比例

XX型

boolean型

  • -XX:+PrintGCDetails

打印GC详细信息。也可关闭 -XX:-PrintGCDetails

  • -XX:+PrintFlagsInitial

打印JVM的所有参数和值。也可直接通过在命令行输入 java -XX:+PrintFlagsInitial 直接查看

  • -XX:+PrintFlagsFinal

会将更改后的JVM参数标记出来(在等号前面加:),也可直接通过在命令行输入 java -XX:+PrintFlagsFinal 直接查看。如下图
olh.png

  • -XX:+PrintCommandLineFlags

仅打印JVM常见参数。同样也可在命令行直接使用: Java -XX:+PrintCommandLineFlags

kv设值型

  • -XX:+Use

指定使用什么GC,例如使用G1 ‐XX:+UseG1GC

  • 配置内存大小
    • -Xms:堆初始内存

如 -Xms128m 。默认为物理内存的1/64,等价于 -XX:initialHeapSize。-X 是jvm的运行参数,ms 是memory start。

  • -Xmx:堆最大内存

超过则OOM。默认为物理内存的1/4,等价于 -XX:MaxHeapSize,建议与 -Xms的大小设置一致,避免频繁调整堆大小带来的性能开销,推荐为节点总内存的70­%-80%;

  • -Xss:单个线程栈的大小

一般默认为512~1024K(根据JDK版本,和系统平台 确定)。等价于-XX:ThresholdStackSize

  • -Xmn:新生代内存大小,一般不调
  • -XX:MetaspaceSize 设置元空间的大小

-XX:MetaspaceSize=512m 设置元空间的大小为512m。
注意:虽然元空间属于物理内存,理论上仅受物理内存大小限制。但是,从实际查询中看出,JVM给了个元空间的默认值20m,当使用超过这个值就会报OOM,所以,根据实际情况可以适当将其设置得更大些,比如512m

  • 配置内存比例
    • -XX:SurvivorRatio

设置新生代中 eden区和s0/s1区的比例。
默认:-XX:SurvivorRatio=8,即Eden:s0:s1=8:1:1
特别说明:串行GC器的比例是8:1:1,并行GC器的比例为6:1:1

  • -XX:NewRatio

配置 young区 和 old区 在堆结构中的占比。NewRatio的值就是设置old区的占比,young区始终占1
默认:-XX:NewRatio=2,即,young区 : old区 = 1:2。一般不用去调整

  • -XX:MaxTenuringThreshold

设置s区 提升到 old区 的 年龄限制,默认值是15,jdk8取值范围规定为(0-15)

其它

  • 查询Java进程的某个属性值:jinfo -flag 属性名 PID
  • 查询Java进程的所有属性值:jinfo -flags PID
  • 查询PID:jps -l

    性能监控

    jdk自带的JVM内存可视化工具:

  • jvisualvm

  • jconsole