JVM参数设置
# JVM参数设置
# 1. 一些命令
📌 jps:查看java后台进程
输入命令:jps -l
控制台输出:
14416 sun.tools.jps.Jps
14964
18388 test.HelloGC
15500 org.jetbrains.idea.maven.server.RemoteMavenServer36
2
3
4
📌 jinfo:查看正在运行java程序的各种信息
命令:jinfo -flag 配置项 进程编号
、jinfo -flags 进程编号
输入命令:jinfo -flag PrintGCDetails 13632
解释:查看13632 Java进程是否开启PrintGCDetails
控制台输出:
-XX:-PrintGCDetails
输入命令:jinfo -flags 13632
解释:查看13632 Java进程所有参数的值
控制台输出:
Attaching to process ID 13632, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.321-b07
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4284481536 -XX:MaxNewSize=1428160512 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+PrintGCDetails -XX:+UseCompr
essedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line: -XX:+PrintGCDetails -javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\lib\idea_rt.jar=59267:D:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\bin -Dfile.encoding=UTF-8
2
3
4
5
6
7
说明:
Non-default VM flags:系统默认的参数
Command line:人为修改的
📌 设置JVM参数
菜单栏Run——Edit Configurations (若没有,可以同Modify options调出来)
📌 查看JVM默认值的方法
1 使用jps命令查看正在运行的线程
2 使用jinfo命令查看具体线程某一参数的值
# 2. JVM的参数类型
java代码到运行:先用javac编译,再java运行。
💎 标配参数
java -version
Java -help
java -showversion
2
3
💎 x参数(了解)
-Xint 解释执行
-Xcomp 第一次使用就编译成本地代码
-Xmixed 混合模式(先编译,再执行)
2
3
💎 xx参数(重点)
⚙ boolean类型
公式:-XX:+ 或者 - 某个属性值
; +
表示开启; -
表示关闭
案例:
查看13632进程是否开启
PrintGCDetails
输入:
jinfo -flag PrintGCDetails 13632
输出:
-XX:-PrintGCDetails
表示没有开启设置开启的方法:设置VM参数
-XX:+PrintGCDetails
参数案例:
是否打印GC收集细节
使用:
-XX:-PrintGCDetails
不使用:
-XX:+PrintGCDetails
是否使用串行垃圾回收器
使用:
-XX:-UseSerialGC
不使用:
-XX:+UseSerialGC
⚙ KV数值类型
公式:-XX:属性key=属性值value
案例:
查看Java线程8576元空间大小:
jinfo -flag MetaspaceSize 8576
输出:-XX:MetaspaceSize=21807104
,元空间默认大小21MB
参数案例:
设置元空间大小:
-XX:MetaspaceSize=128m
升级到老年区的阈值:
-XX:MaxTenuringThreshold=15
# 3. 经典参数-Xms、-Xmx
🔑 -Xms
等价于-XX:InitialHeapSize
表示初始化堆大小,一旦对象容量超过堆的初始容量,JAVA堆会自动扩容到-Xmx大小。
默认值为物理内存的1/64
🔑 -Xmx
等价于-XX:MaxHeapSize
表示堆可以扩展到的最大值,在很多情况下,通常将-Xms和-Xmx设置成一样的,因为当堆不够用而发生扩容时,会发生内存抖动影响程序运行时的稳定性。每次 jvm 向操作系统申请内存时都需要一定的开销,需要占用 CPU 时间。
默认值为物理内存的1/4
元空间大小默认值为本地内存的1/4
⌨ 通过程序获得参数值
public static void main(String[] args) throws InterruptedException {
// Java虚拟机内存总量
long totalMemory = Runtime.getRuntime().totalMemory();
// java虚拟机试图使用的最大内存
long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println("TOTAL_MEMORY(-Xms) = " + totalMemory + " (字节)、" + (totalMemory / (double) 1024 / 1024) + "MB");
System.out.println("MAX_MEMORY(-Xmx) = " + maxMemory + " (字节)、" + (maxMemory / (double) 1024 / 1024) + "MB");
}
2
3
4
5
6
7
8
9
# 4. 经典参数 -Xss
等价于-XX:ThreadStackSize
设置方法:-Xss128k
设置单个线程栈的大小,一般默认值为512k~1024k
# 5. 经典参数 -Xmn
设置年轻代大小
# 6. 经典参数 -XX:MetaspaceSize
设置元空间大小
元空间的本质和永久代类似,都是堆JVM规范中方法区的实现。
区别:元空间不再虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。
# 7. 经典参数 -XX:+PrintGCDetails
输出详细GC收集日志信息
Yong GC 案例
Full GC 案例
规律:GC前内存占用->GC后内存占用 (该内存总大小)
# 8. 经典参数 -XX:SurvivorRatio
设置新生代中eden/S0/S1空间的比例,SurvivorRatio值就是设置eden区的比例占多少,S0/S1相同
默认:-XX:SurvivorRatio=8, Eden:S0:S1 = 8:1:1
设置:-XX:SurvivorRatio=4, Eden:S0:S1 = 4:1:1
# 9. 经典参数 -XX:NewRatio
配置年轻代和老年代再堆结构的占比
默认:-XX:NewRatio=2 新生代:老年代=1:2
设置:-xx:NewRatio=4 新生代:老年代=1:4
# 10. 经典参数 -XX:MaxTenuringThreshold
垃圾进入老年代的年龄
默认:-XX:MaxTenuringThreshold=15
设置:-XX:MaxTenuringThreshold=12
注意:范围为0~15,因为对象头只有4位用于存储年龄,最大值为1111b
# 11. 经典设置案例
-Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
# 12. 盘点JVM默认值
🔎 查看初始值:java -XX:+PrintFlagsInitial
E:\java\code\studyNote\java\target\classes\lsq>java -XX:+PrintFlagsInitial
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product}
uintx AdaptiveSizePolicyInitializingSteps = 20 {product}
uintx AdaptiveSizePolicyOutputInterval = 0 {product}
uintx AdaptiveSizePolicyWeight = 10 {product}
uintx AdaptiveSizeThroughPutPolicy = 0 {product}
uintx AdaptiveTimeWeight = 25 {product}
bool AdjustConcurrency = false {product}
bool AggressiveHeap = false {product}
bool AggressiveOpts = false {product}
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
=
:表示JVM默认加载的值
查看修改更新:java -XX:+PrintFlagsFinal
:=
:表示修改过的值(JVM自己修改或是认为修改)
🔎 设置属性运行Java代码,并查看jvm属性值:
java -XX:+PrintFlagsFinal -Xms128k java程序
🔎 查看默认值:java -XX:+PrintCommandLineFlags -version
输出:
-XX:InitialHeapSize=267755904 -XX:MaxHeapSize=4284094464 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)
2
3
4
可以查看到堆的大小、默认垃圾回收器等。