【JVM】调优实战

本文详细介绍了JVM调优的关键参数,如-Xms,-Xmx,-Xss等,并通过实例解析了如何根据项目情况调整参数以优化性能。调优关注点包括设置元空间大小,控制新生代和老年代的比例,以及配合垃圾收集器如ParNew和CMS进行策略调整,以减少FullGC的发生和管理内存碎片。
摘要由CSDN通过智能技术生成

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虚拟机全程干货无废话,仅供个人学习使用,部分内容为本人自己见解,与千锋教育无关。

一、什么是JVM  JVMJava Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。二、JVM的组成我们先把JVM这个虚拟机画出来,如下图所示:从这张图中我们可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互,我们再来看JVM由哪些部分组成,如下图所示:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值