前言
JVM运行时环境参数学习笔记
布尔型参数采用-XX:+参数名表示启用、-XX:-参数名表示禁用
数值型和字符串型参数采用-XX:参数名=值表示赋值
所有参数必须在-jar <file>.jar之前指定
指定JVM中每个线程栈内存大小
1
| java -XX:ThreadStackSize=1m -jar <file>.jar
|
1
| java -Xss1m -jar <file>.jar
|
指定JVM堆初始内存大小
1
| java -XX:InitialHeapSize=1g -jar <file>.jar
|
1
| java -Xms1g -jar <file>.jar
|
指定JVM堆最大内存大小
1
| java -XX:MaxHeapSize=1g -jar <file>.jar
|
1
| java -Xmx1g -jar <file>.jar
|
指定JVM堆内存中新生代内存大小
-XX:NewSize=:指定新生代初始内存大小
-XX:MaxNewSize=:指定新生代最大内存大小
1
| java -XX:NewSize=1g -XX:MaxNewSize=1g -jar <file>.jar
|
1
| java -Xmn1g -jar <file>.jar
|
固定JVM堆内存中新生代的比例
-XX:SurvivorRatio=8:固定比例为:8/10表示伊甸园(Eden Space),1/10表示幸存区(Survivor Space)的From Survivor,1/10表示幸存区(Survivor)的To Survivor
1
| java -XX:SurvivorRatio=8 -jar <file>.jar
|
指定JVM堆内存中新生代的初始比例并开启动态调整
-XX:InitialSurvivorRatio=8:初始比例为:8/10表示伊甸园(Eden Space),1/10表示幸存区(Survivor Space)的From Survivor,1/10表示幸存区(Survivor)的To Survivor
-XX:+UseAdaptiveSizePolicy:开启动态调整
1
| java -XX:InitialSurvivorRatio=8 -XX:+UseAdaptiveSizePolicy -jar <file>.jar
|
指定JVM堆内存中新生代的晋升阈值
- 新生代中的对象年龄达到阈值时,立刻晋升到老年代
- 有的垃圾回收器晋升阈值默认值为6,有的垃圾回收器晋升阈值默认值为15
-XX:+PrintTenuringDistribution:打印晋升详情
1
| java -XX:MaxTenuringThreshold=15 -jar <file>.jar
|
指定永久代(PermGen)内存大小
- Java1.8之前,JVM通过永久代存放加载的类,占用的是JVM虚拟机的内存
-XX:PermSize=:指定永久代初始内存大小
-XX:MaxPermSize=:指定永久代最大内存大小
1
| java -XX:PermSize=8m -XX:MaxPermSize=8m -jar <file>.jar
|
- Java1.8及之后,JVM通过元空间存放加载的类,占用的是操作系统的物理内存
-XX:MetaspaceSize=:指定元空间初始内存大小
-XX:MaxMetaspaceSize=:指定元空间最大内存大小
1
| java -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m -jar <file>.jar
|
打印GC日志
-verbose:gc:基础GC日志
-XX:+PrintGCDetails:详细GC日志,包含-verbose:gc基础GC日志,无需重复指定
-Xloggc:./gc.log:输出日志为文件
1
| java -XX:+PrintGCDetails -jar <file>.jar
|
强制JVM在触发FullGC之前先执行一次MinorGC
1
| java -XX:+ScavengeBeforeFullGC -jar <file>.jar
|
StringTable串池桶个数
- 通过修改StringTable串池桶个数实现StringTable串池的调优
- StringTable的数据结构是Hash表(数组+链表)实现的,每个数组被称为桶
- 在串池中维护大量的字符串时,桶越多,速度越快
- 在串池中维护少量的字符串时,桶越少,越节省内存
-XX:StringTableSize=:指定StringTable串池桶个数,范围为[1009,2305843009213693951]
1
| java -XX:StringTableSize=1009 -jar xxx.jar
|
禁用显式的GC调用
- 因为手动调用GC进行垃圾回收时,不仅会清理新生代,也会清理老年代,会造成程序暂停时间比较长,所以在进行JVM调优时会禁用显式的GC调用,也就是禁用代码中出现的
System.gc()调用
1
| java -XX:+DisableExplicitGC -jar <file>.jar
|
跟踪类的加载过程
1
| java -XX:+TraceClassLoading -jar <file>.jar
|
完成
参考文献
哔哩哔哩——黑马程序员