常用的JVM参数介绍

深入学习Java基础知识
2021-05-17 14:29 · 阅读时长4分钟
小课

目前Java 11有超过800项JVM参数可配置,不过对于大部分开发者来说,可能用到的也不过几十个,下面就介绍一些常用的JVM参数。

注:运行命令 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version,可查看可支持所有的VM参数。 
堆内存相关的参数

包括设置最小和最大的堆内存限制以及新生代的最小和最大内存限制,这些应该是最常用的VM参数了。

最大堆内存

-Xmx<size>[k|m|G]

用于设置可以分配的最大堆内存,默认单位是byte,可以在大小后面加上k/K、m/M、g/G等使用相应的单位。

-Xmx6G
-Xmx6000m
-Xmx6442450944

上面都表示设置可分配的最大堆内存为6G。

最小堆内存
-Xms<size>[k|m|G]

用于设置可以分配的最小堆内存,也是初始堆内存大小,用法和-Xmx一样。

-Xms2147482548
-Xms2000m
-Xms2G

上面都表示设置可分配的最小堆内存为2G。

新生代的初始内存
-XX:NewSize=<size>[k|m|G]

用于设置新生代的初始化内存大小,用法和设置堆内存大小一样。

-XX:NewSize=1024m
-XX:NewSize=1G

上面都是设置新生代的初始化内存为1G。

新生代的最大内存
-XX:MaxNewSize=<size>[k|m|G]

用于设置新生代的最大可分配内存大小,默认新生代的最大可分配内存大小是由当前最大堆内存和NewRatio算出,调整该值会影响新生代和老年代的占比。

-XX:MaxNewSize=2048m
-XX:NewSize=2G

上面都是设置新生代的最大可分配内存为2G。

垃圾收集器相关的参数

对于不同的业务场景和机器配置,使用不同的垃圾收集器有助于提升性能,如果不手动配置,JVM会根据机器类型,内存大小的因素选择默认垃圾收集器。目前可选的垃圾收集器有以下这些,对于不同环境可能有所不同,比如说低版本中没有G1,ZGC等垃圾收集器,在Java 14中,CMS垃圾收集器已经完全废除等等。

Serial GC             -XX:+UseSerialGC
Parallel GC           -XX:+UseParallelGC
CMS GC                -XX:+UseConcMarkSweepGC
G1 GC                 -XX:+UseG1GC
Shenandoah GC         -XX:+UseShenandoahGC
Z GC                  -XX:+UseZGC
Epsilon GC            -XX:+UseEpsilonGC
垃圾收集日志相关参数

垃圾收集日志包括很多垃圾收集相关的信息,比如内存回收量、暂停时间等等。这部分在Java 8及以下和Java 8以上有所不同,在Java 8及以下可以通过以下方式设置相关参数。

-XX:+PrintGC

输出GC的基础日志,当发生每次GC时,会打印比较简单的信息。

-XX:+PrintGCDetails

输出GC的详细日志,使用的垃圾收集器不同,输出的格式也会有所不同。

-XX:+PrintGCDateStamps 和 -XX:+PrintGCTimeStamps

输出的日志加上日期和时间。

-Xloggc

用于输出重定向到文件,使用该参数会默认设置-XX:PrintGC and -XX:PrintGCTimestamps,用法如下:

java -Xloggc:/tmp/gc.log MainClass

从Java 9开始,GC相关的参数都通过Xlog来配置,原来的GC参数设置和Xlog的对应可参考:Convert GC Logging Flags to Xlog,我们可以通过如下命令查看Xlog的所有可选配置。

java -Xlog:logging=debug -version

比如要输出所有gc相关的debug级别的日志到文件和标准输出,可以这样。

java -Xlog:gc*=debug:stdout -Xlog:gc*=debug:file=/tmp/gc.log MainClass

更多的Xlog配置可参考官网指南Enable Logging with the JVM Unified Logging Framework

jvmparameter