JVM 的具体实现和调优纷繁复杂,本帖主要记录一些开发和测试过程中经常用到的一些参数。
至于更详细的参数介绍和配置,可以参考官方文档来学习。
JVM 的启动参数共分为三类:
- 标准参数(-):所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容;
- 非标准参数(-X):默认的 JVM 实现这些参数的功能,但是并不保证所有 JVM 的实现都满足,且不保证向后兼容;
- 非 Stable 参数(-XX):此类参数各个 JVM 的实现会有所不同,将来可能会随时取消,需要慎重使用。
修改虚拟机栈大小
1 | -Xss<heap_size>[unit] # 设置 JVM 栈的大小。每个线程设置一个值,一般设置几百 k |
修改堆的大小
1 | -Xmx<heap_size>[unit] # 设置堆的最大值 |
注:JVM 启动后并不会将堆扩展到指定最大值,而是:
- 先开辟指定的最小值;
- 如经过数次 GC 之后仍不能满足程序执行:逐步扩容,而不是立即扩容到最大值。
具体到修改堆中某些区域的指令:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 仅限 JDK 1.3 及 1.4 使用
-XX:NewSize=<young_gen_size>[unit] # 设置 YoungGen 的大小,最小值默认是 1310 MB
-XX:MaxNewSize=<max_young_gen_size>[unit] # 设置 YoungGen 的最大值,默认没有限制
-Xmn<heap_size>[unit] # 设置新生代 YoungGen 的内存大小,JDK 1.4 及之后使用
-XX:PermSize=<perm_gen_size>[unit] # 设置初始永久区的大小
-XX:MaxPermSize=<perm_gen_size>[unit] # 设置永久区的最大值
# 注:因永久区在 Java 8 已被取消,上述两个参数仅适用于 Java 7 及之前版本
# 仅适用于 Java 8 及以后版本
-XX:MaxMetaspaceSize=<max_metaspace_size>[unit] # 设置 Metaspace 元空间最大值,默认没有限制
# 设置了值之后,每当元空间达到阈值之后,方法区开始内存回收。
-XX:SurvivorRatio=<ratio> # 设置 Survivor 区与 Eden 区的比例,默认为 0.25
# 如: -XX:SurvivorRatio=0.25
-XX:NewRatio=<ratio> # 设置 YoungGen 区与 OldGen 区的比例,默认比例为 1:2
# 如:-XX:NewRatio=0.25
GC 相关
可调用的 GC:1
2
3
4
5
6-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:+USeParNewGC
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
GC 输出:1
2
3
4
5
6
7
8
9
10
11
12
13verbose:gc # 启动 JVM 时,输出 JVM 里面的 GC 信息
# 输出:
# [Full GC] 178K->99K(1984K), 0.0253877 secs]
# 解释:
# Full GC:执行了一次 Full GC
# 178K, 99K:执行 GC 前后内存容量
# 1984K:内存总容量
# ... secs:执行本次 GC 耗时
-XX:+printGC # 同上
-XX:+PrintHeapAtGC # 每一次 GC 发生前后都打印堆的信息,格式同上
-XX:+PrintReferenceGC # 打印对象引用信息
1 | -XX:+PrintGCDetails # 打印 GC 的详细信息 |
解析:
new generation
是新生代tenured generation
是老年代compacting perm gen
是永久区- 三个地址值分别为该片内存的起始点,当前使用到的地方,和最大的内存地点
1 | -X:loggc:log/gc.log # 指定输出 gc.log 的文件位置 |
其他
1 | -XX:StringTableSize=66666 # 设定 StringTable 的长度 |