内存溢出分析工具MAT实战(一)JVM启动参数分析

时间:2022-12-21 16:57:57


在工作的过程中,有时我们会遇到内存溢出的问题,这时候就需要我们有足够的知识积累去解决内存溢出相关问题。

文章是建立在读者了解java的内存结构的基础上。

关于内存分析工具,mat是非常实用的一款内存分析工具,下面我们针对实际情况对其进行介绍。

一、获取分析文件

一般我们分析内存的时候都是针对dump文件进行分析,关于dump文件的获取,有两种方式,一种是在jvm参数中添加,当内存溢出时生成dump文件。一种是通过jmap -dump生成dump文件。我们以一下jvm配置为例,对jvm参数进行解析。


-Xms512m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xmn256m -XX:MaxDirectMemorySize=1g -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000 -Xloggc:$work_dir/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$work_dir/logs/java.hprof -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=10000 -Dsun.net.client.defaultReadTimeout=30000 -DJM.LOG.PATH=$work_dir/logs -DJM.SNAPSHOT.PATH=$work_dir/snapshots -Dfile.encoding=utf-8

-Xms:初始堆内存空间。-Xmx:最大堆内存空间,-XX:MetaspaceSize:元数据区空间,

-XX:MaxMetaspaceSize:最大元数据区空间,-Xmn256m:栈空间大小,XX:SurvivorRatio:survivor区占用的比例

-XX:+UseConcMarkSweepGC:使用CMS垃圾收集器,

-XX:CMSMaxAbortablePrecleanTime:CMS进行垃圾收集有一个预清理阶段,此参数规定了预清理阶段的最长时间

-XX:+CMSClassUnloadingEnabled:这个参数表示在使用CMS垃圾回收机制的时候是否启用类卸载功能。默认这个是设置为不启用的,所以你想启用这个功能你需要在Java参数中明确的设置下面的参数:-XX:+CMSClassUnloadingEnabled,如果你启用了CMSClassUnloadingEnabled ,垃圾回收会清理持久代,移除不再使用的classes。这个参数只有在 ​​UseConcMarkSweepGC​​  也启用的情况下才有用。

-XX:CMSInitiatingOccupancyFraction=70 和-XX:+UseCMSInitiatingOccupancyOnly:这两个设置一般配合使用,一般用于『降低CMS GC频率或者增加频率、减少GC时长』的需求

   -XX:CMSInitiatingOccupancyFraction=70 是指设定CMS在对内存占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);

   -XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整.

-XX:+ExplicitGCInvokesConcurrent:只在CMS收集器中有用,如果执行System.gc(),则做并发执行FullGC。

-Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000:2592000000为定时触发的时间间隔设置,单位是毫秒,可适当延长触发FGC的定时时间间隔。

-Xloggc:$work_dir/logs/gc.log:gc日志的地址

-XX:+PrintGCDetails -XX:+PrintGCDateStamps:设定打印GC日志

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$work_dir/logs/java.hprof:发生内存溢出导致宕机的时候生成dump文件,以及dump文件的地址

-Djava.awt.headless=true:如果需要使用java的画笔等功能,需要设置此属性为true

-Dsun.net.client.defaultConnectTimeout=10000 -Dsun.net.client.defaultReadTimeout=30000:客户端连接和读数据超时时间

-DJM.LOG.PATH=$work_dir/logs -DJM.SNAPSHOT.PATH=$work_dir/snapshots:jvm日志打印的地址

-Dfile.encoding=utf-8:设置文件的默认编码为utf-8

JVM的启动参数是非常多的(有好几百),没有必要掌握,只需要知道常用的那几个即可,更多参数请参考JVM官方文档:​​https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDJJFI​

注意:这些jvm参数中与我们分析dump文件相关的设置是:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$work_dir/logs/java.hprof:发生内存溢出导致宕机的时候生成dump文件,以及dump文件的地址

了解了JVM相关的配置,下面我们一起来分析,Dump日志。

​MAT使用官方文档​