一、JVM调优和参数配置
1.1 JVM参数类型
1.1.1 标配参数
java -version
java -help
java -showversion
在jdk各个版本之间稳定,很少有大的变化
1.1.2 X参数-Xint:解释执行
-Xcomp:第一次使用就编译成本地代码
-Xmixed:混合模式
如何查看一个正在运行中的java程序,它的某个jvm参数是否开启?具体值是多少?
jps -l #查看进程号
jinfo -flag PrintGCDetails 进程号 #查看该进程号是否开启某个参数
1.Boolean类型
公式:
-XX:+或者- 某个属性值
+表示开启, -表示关闭
1.是否打印GC收集细节
-XX:+PrintGCDetails
-XX:-PrintGCDetails
2.是否使用串行垃圾收集器
-XX:+UseSerialGC
-XX:-UseSerialGC
2.KV设置类型
1.公式
-XX:属性key=属性值value
2.Case
-XX:MetaspaceSize=128m
-XX:MaxTenuringThreshold=15
3.jinfo举例,如何查看当前运行程序的配置
jinfo -flag 配置项 进程编号
Command line表示我们后台修改过的值
4. 经典参数
-Xms和-Xmx
-Xms: 等价于-XX:InitialHeapSize初始化堆内存
-Xmx: 等价于-XX:MaxHeapSize最大堆内存
这两个参数也还是属于XX参数,只不过这两个参数常用,所以,就起了一种别名来代替复杂的名字
1.2 查看JVM默认值 1.2.1 -XX:+PrintFlagsInitial-XX:+PrintFlagsInitial:查看初始默认值
java -XX:+PrintFlagsInitial -version
java -XX:+PrintFlagsInitial
-XX:PrintFlagsFinal:主要查看修改更新
java -XX:+PrintFlagsFinal
java -XX:+PrintFlagsFinal -version
初始值
java -XX:+PrintFlagsFinal -version
更新值
java -XX:+PrintFlagsFinal -Xss128k Test
java -XX:+PrintCommandLineFlags -version
long totalMemory = Runtime.getRuntime().totalMemory(); //返回java虚拟机中的内存变量
long maxMemory = Runtime.getRuntime().maxMemory(); //返回java虚拟机试图使用的最大内存量
System.out.println("TOTAL_MEMORY(-Xms) = " + totalMemory + " (字节) 、" +(totalMemory / (double)1024 / 1024 + "MB"));
System.out.println("MAX_MEMORY(-Xmx) = " + maxMemory + " (字节) 、" +(totalMemory / (double)1024 / 1024 + "MB"));
2.2 常用参数
2.2.1 -Xms
堆初始大小内存,默认为物理内存1/64
-Xms等价于-XX:InitialHeapSize
2.2.2 -Xmx
堆最大分配内存,默认为物理内存1/4
-Xmx等价于-XX:MaxHeapSize
2.2.3 -Xss
设置单个线程的栈空间大小,一般默认为512K-1024K
-Xss等价于-XX:ThreadStackSize
系统出厂默认值是跟平台有关,一般生产环境都是部署到linux系统(也即1024KB)
-Xmn
设置年轻代大小,一般都不用设置,一般都是用默认的即可
年轻代占堆的1/3,年老代占堆的2/3
2.2.5 -XX:MetaspaceSize
设置元空间大小
-XX:MetaspaceSize
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:
元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。不管是几个G的内存,元空间默认都只占用20多M
java -XX:+PrintFlagsFinal -version
虽然,机器内存有16G,但是实际元空间默认只占了约21M,如果频繁反复的去new一些对象,就可能把这个给撑爆,为了避免元空间OOM,可以将元空间配置的大一些
2.2.6 典型设置案例打印结果
-XX:InitialHeapSize=266207424
-XX:MaxHeapSize=4259318784
-XX:+PrintCommandLineFlags
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC 并行垃圾收集器
更改参数
-Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:InitialHeapSize=134217728
-XX:MaxHeapSize=4294967296
-XX:MetaspaceSize=536870912
-XX:+PrintCommandLineFlags
-XX:+PrintGCDetails
-XX:ThreadStackSize=1024
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation
-XX:+UseSerialGC 串行垃圾收集器
2.2.7 -XX:+PrintGCDetails
-XX:+PrintGCDetails 输出详细GC收集日志信息
GC
FullGC
设置新生代中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相同
配置新生代与老年代在堆结构的占比
默认
-XX:NewRatio=2 新生代占1,老年代占2,年轻代占整个堆的1/3
假如
-XX:NewRatio=4 新生代占1,老年代占4,年轻代占整个堆的1/5
NewRatio值就是设置老年代的占比,剩下的1给新生代
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代被回收的概率。
-XX:MaxTenuringThreshold 设置垃圾最大年龄
视频教程,源码