前言
JVM运行时环境参数学习笔记
指定虚拟机栈内存
- 虚拟机栈存放的是Java程序运行时的线程
- 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的方法
- 虚拟机栈内存:Java程序运行时的线程所占用的内存最大值
- Windows默认虚拟机栈内存是默认虚拟内存
- Linux/MacOS默认虚拟机栈内存是1024KB
- 由于操作系统的内存总和是一定的,所以如果虚拟机栈内存越大(单个线程可以使用的内存越大),那么一个进程可以创建的线程总数将越小,所以虚拟机栈内存不是越大越好
-Xss
:指定虚拟机栈内存
1
| java -jar xxx.jar -Xss1m
|
堆内存初始大小
1
| java -jar xxx.jar -Xms4g
|
堆内存最大大小
- 每当Java程序new出新对象时,都会将对象放入堆内存
- 堆内存中的数据是线程共享的,所以需要考虑线程安全问题
- 堆内存有垃圾回收机制
- 为了找到堆内存溢出的问题,通常可以将堆内存设置小一点,这样可以将问题尽早暴露,避免因堆内存过大导致错过堆内存溢出的问题
-Xmx
:指定堆内存
1
| java -jar xxx.jar -Xmx4g
|
1
| java -jar xxx.jar -XX:MaxHeapSize=4g
|
新生代初始大小和最大大小
1
| java -jar xxx.jar -Xmn4g
|
新生代初始大小
1
| java -jar xxx.jar -XX:NewSize=4g
|
新生代最大大小
1
| java -jar xxx.jar -XX:MaxNewSize=4g
|
幸存区比例
-XX:SurvivorRatio=8
:其中8/10表示伊甸园,1/10表示幸存区From,1/10表示幸存区To
1
| java -jar xxx.jar -XX:SurvivorRatio=8
|
动态调整幸存区比例
-XX:InitialSurviorRatio=8
:指定初始幸存区比例
-XX:+UseAdptiveSizePolicy
:开启动态调整
1
| java -jar xxx.jar -XX:InitialSurviorRatio=8 -XX:+UseAdptiveSizePolicy
|
晋升阈值
- 当达到晋升阈值时,将会从幸存区晋升到老年代
- 有的垃圾回收器晋升阈值默认值为6,有的垃圾回收器晋升阈值默认值为15
1
| java -jar xxx.jar -XX:MaxTenuringThreshold=15
|
打印晋升详情
1
| java -jar xxx.jar -XX:+PrintTenuringDistribution
|
永久代大小
- Java1.8之前用于加载类的空间,占用的是JVM虚拟机的内存
-XX:MaxPermSize=
:指定永久代大小
1
| java -jar xxx.jar -XX:MaxPermSize=8m
|
打印GC详情
1
| java -jar xxx.jar -XX:+PrintGCDetails -verbose:gc
|
开启MinorGC
1
| java -jar xxx.jar -XX:+ScavengeBeforeFullGC
|
元空间大小
- Java1.8及之后用于加载类的内存空间,占用的是操作系统的内存
-XX:MaxMetaspaceSize=
:指定元空间大小
1
| java -jar xxx.jar -XX:MaxMetaspaceSize=8m
|
StringTable串池桶个数
- 通过修改StringTable串池桶个数实现StringTable串池的调优
- StringTable的数据结构是Hash表(数组+链表)实现的,每个数组被称为桶
- 在串池中维护大量的字符串时,桶越多,速度越快
- 在串池中维护少量的字符串时,桶越少,速度越快
-XX:StringTableSize=
:指定StringTable串池桶个数,范围为[1009,2305843009213693951]
1
| java -jar xxx.jar -XX:StringTableSize=1009
|
禁用显式的GC调用
- 因为手动调用GC进行垃圾回收时,不仅会清理新生代,也会清理老年代,会造成程序暂停时间比较长,所以在进行JVM调优时会禁用显式的GC调用,也就是禁用代码中出现的
System.gc()
调用
1
| java -jar xxx.jar -XX:+DisableExplicitGC
|
完成
参考文献
哔哩哔哩——黑马程序员