oom分析处理过程

前言

实验室维护的项目在用户使用量增大的时候,隔三差五就会出现OOMOutOfMemory的情况,而且多数是发生在第二天的凌晨,为了缓解这个问题,写了一个定时任务,每次服务宕机的时候,就重启一下Tomcat服务。但是这样子处理问题治标不治本,还是需要从代码的优化角度去减少这种情况的发生。

运行环境分析

环境:Windows severjdk1.8tomcat7 。如果你的Tomcat是安装版的,想要修改运行参数需要从注册表中修改.

如果是解压版的,若是命令行方式启动tomcat,则修改脚本文件(Windows下为catalina.bat,Linux下为catalina.sh,在最顶上添加如下行)。具体的参数还需要去了解JVM的一些知识,如GC策略、年轻老年代的大小调优等,需要根据自己的业务场景去修改配置。

1
set JAVA_OPTS=-Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m。

如果是通过tomact7w.exe的方式启动,可以在界面添加 参数。我的环境用的第三种方式启动。出现oom的情况,可以适当的提高一下参数值,但OOM的问题还是会出现,只是推迟这种情况的发生。

OOM处理过程

前面提到,在最初的时候,是通过设置-Xmx、-Xms、-Xmn等参数来改变堆内存最大初始等值。如下图在tomat7w.exe中的java栏设置,将堆的初始值和最大值设为400M。

上面的操作只会减缓OOM的到达时间而已,所以还需要把OOM出现时的堆快照保存下来,然后去分析堆中哪些对象有异常大小的情况。在刚刚设置堆大小的页面中的Java Options添加-XX:+HeapDumpOnOutOfMemoryError当内存出现OOM时把文件dump出来。-XX:HeapDumpPath=D:\heap\dump\导出的文件存放位置。

你想输入的替代文字

当堆的快照文件被dump出,你可以看到在对应的文件夹下回生成一个file.hprof文件,这个文件存对象占用堆内存的一些使用情况。接着我们使用eclipse的插件MAT(Memory Analysis Tools)去分析,MAT的安装就不在复述,网上的资料很多。MAT打开hprof文件,界面如下

你想输入的替代文字

MAT的功能界面可以再网上找资料,这里我只是简单记录一下处理的过程。内存溢出的处理需要JVM的基础知识,这样才可以帮你更好的解决问题。我在早期记录一些关于JVM的博客,一点笔记可以方便知识的回顾。点击查看

除了MAT,内存分析工具还是比较多的,像VisualVM是Java自带的分析工具,不过在jdk9中就不在提供,需要额外下载。jaht是一个实验性的, 老旧的工具, 不再被支持. 虽然JEP没有指明替代工具, InfoQ 推荐大家使用VisualVM来完成堆内存的创建,分析和可视化任务。