JVM-参数和调优
# JVM参数和调优
# JVM的参数类型
# 标配参数
--在jdk各个版本之间稳定,很少有大变化

# -version
# -help
# java -showversion
# X参数

# -Xlint - 解释执行
# -Xcomp - 第一次使用就编译成本地代码
# -Xmixed - 混合模式
# XX参数
# Boolean类型
- 公式
- -XX:+或者-某个属性值(+表示开启,-表示关闭)
- Case
- 是否打印GC的收集细节 -- -XX:-PrintGCDetails,-XX:+PrintGCDetails
- 是否使用串行垃圾回收器 -- -XX:-UseSerialGC,-XX:+UseSerialGC
- 如何查看一个正在运行中的Java程序?它的某个jvm参数是否开启?具体值是多少?
jps -l查看进程号
jinfo -flag PrintGCDetails 进程号
demo
public class HelloGC { public static void main(String[] args) { System.out.println("**************hello GC"); try{ TimeUnit.SECONDS.sleep(Integer.MAX_VALUE); }catch(Exception e){e.printStackTrace();} } }1
2
3
4
5
6


# KV设值类型
- 公式
- -XX:属性key = 属性值value
- Case
- -XX:MetaspaceSize=128m
- -XX:MaxTenuringThreshold=15
- 如何查看一个正在运行中的Java程序?它的某个jvm参数是否开启?具体值是多少?(同上Boolean类型)
# jinfo类型,如何查看当前运行程序的配置
- 公式
- jinfo -flag 配置项 进程号
- Case
- jinfo -flag InitialHeapSize 进程号

- jinfo -flags 进程号

- jinfo -flag InitialHeapSize 进程号
# 题外话(坑)-- -Xms和-Xmx这两个参数你怎么解释?-Xms1024m -Xmx1024m
- -Xms等价于-XX:InitialHeapSize
- -Xmx等价于-XX:MaxHeapSize
# 盘点家底查看JVM默认值
- 第一种盘点家底查看JVM参数的方法
- jps
- jinfo -flag 具体参数 Java进程编号
- jinfo -flags Java进程编号
- 第二种盘点家底查看JVM参数的方法
- -XX:+PrintFlagsInitial
- 主要查看初始默认
- 公式
- java -XX:+PrintFlagsInitial -version
- java -XX:+PrintFlagsInitial
- Case
- -XX:+PrintFlagsFinal
- 主要查看修改更新
- 公式
- java -XX:+PrintFlagsFinal -version
- java -XX:+PrintFlagsFinal
- Case
- PrintFlagsFinal举例:运行java命令的同时打印出参数
- -XX:PrintCommandLineFlags
- 打印命令行参数

- -XX:+PrintFlagsInitial
# 常用的JVM基本配置
# 基础
- JMM-Java内存模型

- Case
public class HelloGC1 {
public static void main(String[] args) {
//默认物理内存的1/64
long totalMemory = Runtime.getRuntime().totalMemory();
//默认物理内存的1/4
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");
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 常用参数
# -Xms
- 初始大小内存,默认为物理内存的1/64
- 等价于-XX:InitialHeapSize
# -Xmx
- 最大分配内存,默认为物理内存的1/4
- 等价于-XX:MaxHeapSize
# -Xss
- 设置单个线程栈的大小,一般默认为512k~1024k,依赖于操作系统平台
- 等价于-XX:ThreadStackSize
- Case
- 为0代表默认参数。512k~1024k

- 调整-Xss1024k

- 为0代表默认参数。512k~1024k
- Java8文档说明

# -Xmn
- 设置年轻代大小,一般不调整,1/3堆空间(老年代2/3堆空间)
# -XX:MetaspaceSize
- 设置元空间大小
- 元空间的本质和永久代类似,都是对JVM规范中方法区的实现
- 不过元空间和永久代的最大区别是,元空间并不在虚拟机中,而是使用本地内存,因此,默认情况下,元空间的大小仅受本地内存限制
- -Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal
# 典型设置案例
- -Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
# -XX:PrintGCDetails
- 输出详细GC收集日志信息
- GC
- 主要YoungGC

- 主要YoungGC
- FullGC
- 主要OldGC Java7 PermGen -> Java8 Metaspace

- 主要OldGC Java7 PermGen -> Java8 Metaspace
# -XX:SurvivorRatio
- 设置新生代中eden和s0/s1空间的比例
- 默认-XX:SurvivorRatio=8,Eden:S0:S1=8:1:1
- 假如-XX:SurvivorRatio=4,Eden:S0:S1=4:1:1,SurvivorRatio就是设置Eden区的比例占多少,S0/S1相同
- Case:-XX:+PrintGCDetails -XX:+UseSerialGC -Xms10m -Xmx10m -XX:SurvivorRatio=8

- Case:-XX:+PrintGCDetails -XX:+UseSerialGC -Xms10m -Xmx10m -XX:SurvivorRatio=4

# -XX:NewRatio
- 配置年轻代与老年代在堆内存中的占比
- 默认-XX:NewRatio=2,年轻代占1,老年代占2,年轻代占整个堆内存的1/3
- 假如-XX:NewRatio=4,新生代占1,老年代占4,年轻代占整个堆内存的1/5,NewRatio值就是设置老年代的占比,剩下的1给新生代
- Case:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=2

- Case:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=4

# -XX:MaxTenuringThreshold
- 设置垃圾的最大年龄,默认为15次,从yound到old
- -XX:MaxTenuringThreshold=0
- 设置为0,则年轻代对象不经过Survivor区,直接进入老年区。对于老年代较多的应用,可以提高效率。
- 设置为一个较大值,则年轻代对象在Survivor进行多次复制,这样可以增加对象在年轻代的存活时间,增加年轻代被回收的概率。
- Java8给这个参数做了限制,只能在[0,15]之间。
# 
编辑 (opens new window)
上次更新: 2024/05/24, 11:36:46



