JVM调优实战

  • 1、JVM基础参数配置
  • 2、JVM常用命令
  • 3、调优工具


1、JVM基础参数配置

  1. -Xmx 最大堆内存
  2. -Xms 最小堆内存

一般来说,在项目正式上线的时候,最大堆内存和最小堆内存需要设置成一样大小,防止JVM自动对内存自动扩展。因为JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收

  1. -Xmn 指定新生代的内存
  2. -XX:NewRatio 新生代(eden+from+to)和老年代(不包含永久区)的比值:
  3. -XX:SurvivorRatio Survivor区与Eden区的比值:

这2个比值的计算规则如下:
若-XX:NewRatio=4,则表示新生代:老年代=1:4,那么新生代(eden+from+to)=3072+512+512=4096k,老年代=16384k,新生代:老年代=4096k:16384k=1:4。
若-XX:SurvivorRatio=6,则表示Survivor区:Eden区=2:6,那么Survivor区(from+to)=1024+1024=2048,Eden区=6144,Survivor区:Eden区=2048:6144=2:6,这样的话,一个幸存区占整个新生代区的1:(2+6)=1/8
注:3,4,5实际上用不上,不用去刻意的设置,用JVM默认的配置即可,这里了解下。官房推荐新生代占堆的3/8,幸存代占新生代的1/10

2、JVM常用命令

Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo等

  1. jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
  2. jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
  3. jmap,JVM Memory Map命令用于生成heap dump文件
  4. jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
  5. jstack,用于生成java虚拟机当前时刻的线程快照。 --这个可以排查死锁,当你的项目并发量不是很高,但是CPU却消耗比较多,可以看看。
  6. jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。

场景:如果你发现项目运行速度变慢,但是不知道具体原因,可以用上面的命令去查看JVM的详细信息,比如JVM经常发生内存溢出,但是堆的大小已经设置的够大了,这个时候你就得看看JVM堆中是不是存在很多的大对象。处理流程
1、先通过jps -l,获取JVM运行的所有进程,获取相对应进程的PID
2、通过jmap -heap pid,获取堆heap的概要信息,GC使用的算法,heap(堆)的配置及JVM堆内存的使用情况
3、查看打印的JVM堆运行信息,或者导出文件,借助jhat命令或者第三方工具分析文件,排查问题。

3、调优工具

常用调优工具分为两类,jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory Analyzer Tool)、GChisto。

  1. jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控
  2. jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。
  3. MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
  4. GChisto,一款专业分析gc日志的工具