【笔记】JVM运行时环境参数

前言

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

指定元空间(Metaspace)内存大小

  • 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

完成

参考文献

哔哩哔哩——黑马程序员