9、JVM调优实战
9.1、JVM调优的核心参数
-Xss:每个线程的栈大小。设置越小,说明⼀个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多。
-Xms:设置堆的初始可用大小,默认物理内存的1/64
-Xmx:设置堆的最⼤可用大小,默认物理内存的1/4
-Xmn:新生代大小
-XX:NewRatio:默认2表示新生代占老年代的1/2,占整个堆内存的1/3。
-XX:SurvivorRatio:默认8表示⼀个survivor区占用1/8的Eden内存,即1/10的新生代内存。
以下两个参数设置元空间大小建议值相同,且写死,防⽌在程序启动时因为需要元空间的空间不够而频繁full gc。
-XX:MaxMetaspaceSize:最⼤元空间大小
-XX:MetaspaceSize:元空间大小,默认是21M,达到该值后会触发Full GC,同时会按100%进行动态调整,为了减少⼤数据量占满元空间,频繁触发Full GC,建议在初始化时设置为跟MaxMetaspaceSize相同的值。
9.2、JVM调优实战
项目情况
设置JVM参数:
‐Xms3072M ‐Xmx3072M ‐Xss1M ‐XX:MetaspaceSize=256M
‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8
解析:每秒产生75MB的垃圾,Eden区800MB/(75MB/s)=11秒放满。第11秒时Eden区无法存放新生成的75MB的垃圾,触发Minor GC,11秒前的垃圾全部被回收,但是此时第11秒的对象还不是垃圾,所以会放到S区,此时75MB对象已经大于S区的50%,此时根据对象动态年龄判断,会把75MB对象的放到Old区,进入Old区后75MB对象就已经成为垃圾了。以此类推,每隔11秒就会在Old区产生75MB的垃圾。所以经过第2GB/75MB=27个11秒,也就是5分钟触发一次Full GC。
调整JVM参数
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M
‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8
解析:改变新生代的大小为2G后,1600MB/(75MB/s)=22s触发Minor GC,75MB对象进入S区,第二个22s的75MB对象进入S区时,上一次进入S区的75MB对象已经成为垃圾,所以S区保持75MB的对象,每隔22s就会被删掉,不会进入Old区
9.3、调优的关键点
-
设置元空间大小,最大值和初始化值相同
-
根据业务场景计算出每秒产生多少的对象。这些对象间隔多长时间会成为垃圾(⼀般根据接口响应时间来判断)
-
计算出堆中新生代中eden、survivor所需要的大小:根据上⼀条每条产生的对象和多少时间成为垃圾来计算出,依据是尽量减少full gc。
9.4、结合垃圾收集器的调优策略
结合垃圾收集器:PraNew+CMS,对于CMS的垃圾收集器,还需要加上相关的配置:
-
对于⼀些年龄较大的bean,比如缓存对象、spring相关的容器对象,配置相关的对象,这些对象需要尽快的进⼊到老年代,因此需要配置:
-XX:MaxTenuringThreshold=5
-
大对象直接进入到老年代:
-XX:PretenureSizeThreshold=1M
-
CMS垃圾收集器会有并发模式失败的风险(转换为使用serialOld垃圾收集器),如何避免这种风险:将full gc的触发点调低:
-XX:CMSInitiatingOccupancyFraction=85
(默认是92),相当于老年代使用率达到85%就触发full gc,于是还剩15%的空间允许在cms进行gc的过程中产生新的对象。
CMS垃圾收集器收集完后会产生碎片,碎片需要整理,但不是每次收集完就整理,设置做了3次Full GC之后整理⼀次碎片:
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=3
PraNew+CMS的具体JVM参数配置:
java -Xms3072M -Xmx3072M -Xmn2048M -Xss1M
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=85
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=3
-jar device-service.jar
本文章参考B站 千锋教育JVM全套教程(含jvm调优、jvm虚拟机、jvm面试题、jvm源码详解)系统玩转java虚拟机全程干货无废话,仅供个人学习使用,部分内容为本人自己见解,与千锋教育无关。