基础 | JVM - [参数]
@
§1 JVM 参数分类
-
标准参数(-)
所有的 JVM 实现都必须实现这些参数的功能
向后兼容-version -help详细信息参阅 (此信息为下面指令提供)

-
非标准参数(-X):
默认jvm实现这些参数的功能,但并不保证所有jvm实现都满足
不保证向后兼容-Xint -Xmixed下面指令提示:
-X 选项是非标准选项。如有更改,恕不另行通知。

-
非Stable参数(-XX)
此类参数各个jvm实现会有所不同
将来可能会随时取消XX 参数主要分为两种
-
boolean 型
通常写作-XX:+xxx或-XX:-xxx,表示开启或关闭 xxx,如:-XX:+PrintGCDetails -XX:-UseParallelGC -
KV 型
即键值对形式,通常写作-XX:key=value,如:-XX:MetaspaceSize=20m
-
§2 参数查看
详细指令参考 基础 | JDK - [指令]
查看 java 进程号
jps -l
查看 JVM 所有参数的实际值
java -XX:+PrintFlagsFinal
字段依次为
- 参数类型
- 参数名
- 是否被修改(= 表示默认值,:= 表示被修改)
- 参数类别
- product :官方支持, JVM内部选项
- rw :可动态写入的.
- C1:Client JIT 编译器
- C2:Server JIT 编译器
- pd:platform Dependent 平台独立
- lp64:仅 64 位JVM
- manageable:代表可以运行时修改
- diagnostic:用于虚拟机debug的
- experimental:非官方支持的

查看 JVM 所有参数的初始值
java -XX:+PrintFlagsInitial
查看所有改动过的 XX 参数
jinfo -flags 进程号
Non-default VM flags 中参数是系统改动过的参数
Command line 中参数是认为改动过的参数

查看所有命令行参数
java -XX:+PrintCommandLineFlags

看具体某具体 XX 参数
jinfo -flag 参数名 进程号


查看具体 X 参数
无法直接查看,但可以通过查看堆的信息获取
jmap -heap 进程号
信息如下
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4219469824 (4024.0MB)
NewSize = 88080384 (84.0MB)
MaxNewSize = 1406140416 (1341.0MB)
OldSize = 176160768 (168.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 66060288 (63.0MB)
used = 9248656 (8.820205688476562MB)
free = 56811632 (54.17979431152344MB)
14.000326489645337% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
PS Old Generation
capacity = 176160768 (168.0MB)
used = 0 (0.0MB)
free = 176160768 (168.0MB)
0.0% used
通过 java 代码查看内存
public static void main(String[] args) throws InterruptedException {
System.out.println("JVM params");
System.out.println(Runtime.getRuntime().freeMemory());
System.out.println(Runtime.getRuntime().maxMemory());
System.out.println(Runtime.getRuntime().totalMemory());
TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
}
说明
freeMemory() + totalMemory() 是JVM 虚拟机从操作系统分配的内存
- 如果配置了 -Xms 这俩值的和就是配置值
- 如果没有配置 -Xms 这俩值的和就是比满足当前虚拟机运行再稍多一点
- 这两部分的初始比例大约是 1:4,如下图
- 这些内存中使用了的部分是 totalMemory(),没使用的是 freeMemory()

maxMemory() 是允许 JVM 使用的最大的内存值
- 相当于 -Xmx 配置值
- 没配置时默认大约 1/4 物理内存
§3 标准参数
查看版本
-version

帮助
-help

§4 -X 参数
堆初始容量
-Xms
初始堆大小,默认约 1/64 物理内存
与 -XX:InitialHeapSize 等价,实际属于 XX 参数
为避免 JVM 内存忽高忽低,通常与 -Xmx 一致
堆最大容量
-Xmx
最大堆大小,默认约 1/4 物理内存
与 -XX:MaxHeapSize 等价,实际属于 XX 参数
为避免 JVM 内存忽高忽低,通常与 -Xms 一致
新生代容量
-Xmn
与 -XX:MaxNewSize 等价,实际属于 XX 参数
通常,Eden:From:To:Old = 8:1:1:20
栈容量
-Xss
单个线程栈的内存大小, 1M,与系统和硬件有关
与 -XX:ThreadStackSize 等价,实际属于 XX 参数,其值为 0 时表示使用默认数值
每个线程的栈的大小,不是总大小
§5 -XX 参数
元空间大小
-XX:MetaspaceSize
类似以前的永久代,用于实现 JVM 规范中的方法区
但元空间直接使用本地内存,不在虚拟机中,因此默认只受本地内存影响
但是,元空间默认大小 20 M 左右,频繁创建对象时容易出现 OOM:Metaspace
因此此参数可以设大,比如取值 1024m
直接内存大小
-XX:MaxDirectMemorySize
不同于 -XX:MetaspaceSize ,此参数可以是 NIO 拥有更多的 Direct Buffer Memory
输出 GC 日志
-XX:+PrintGCDetails
会在发生 GC 或 Full GC 时输出 GC 日志
GC 日志参考 基础 | JVM - [GC]

GC 日志如下图

FROM / TO 区比例
-XX:SruvivorRatio
实际值使用的是 Eden 对 FROM / TO 的倍数
即
-XX:SruvivorRatio=8 时,Eden:FROM:TO = 8:1:1 (默认比例)
-XX:SruvivorRatio=6 时,Eden:FROM:TO = 6:1:1
Eden 区比例
-XX:NewRatio
实际值使用的是 Old 对 Eden 的倍数
即
-XX:NewRatio=2 时,Old:Eden = 2:1 (默认比例)
-XX:NewRatio=1 时,Old:Eden = 1:1
传说
在默认的并行垃圾回收期配置下,一直使用默认配置,用户指定无效
最大对象年龄
-XX:MaxTenuringThreshold
指一个对象经历多少次垃圾回收后,若依然存活,则进入老年代
此值取值范围为 [0,15],默认 15
查看 JVM 所有参数的实际值
见 查看 JVM 所有参数的实际值
查看 JVM 所有参数的初始值
见 查看 JVM 所有参数的初始值
查看所有命令行参数
见 查看所有命令行参数
§6 典型配置案例
(16G 内存)
-XX:InitialHeapSize=128m
-XX:MaxHeapSize=4096m
-XX:MetaspaceSize=512m
-XX:ThreadStackSize=1m
-XX:+PrintGCDetails
(用于开启类指针压缩,默认开启)
-XX:+UseCompressedOops
-XX:+UseCompressedClassPointers
-XX:-UseLargePageIndividualAllocation
-XX:+PrintCommandLineFlags
(垃圾回收器)
-XX:+UseSerialGc

浙公网安备 33010602011771号