java内存溢出(OutOfMemoryError)问题排查

关于项目中出现OutOfMemoryError错误问题排查分析,可以根据实际情况使用不同的方法

方法一、项目运行过程中,监控jvm内存使用情况,发现异常

首先利用jps命令查看jvm进程ID

java内存溢出(OutOfMemoryError)问题排查

这里的OomTest类是我Eclipse中运行的main方法所在的类,以此为例。

然后利用jmap命令查看目前堆中对象的统计信息

java内存溢出(OutOfMemoryError)问题排查

jmap -histo [pid] 命令可以列出内存中对象的统计信息,包括实例个数、内存使用以及类名,并按照内存使用大小自动排序,根据打印结果,我们可以清晰看到,目前内存中到底是谁使用了大量内存,上面结果中我们看到TestObject对象实例数很高,这样我们就可以找到项目中该类使用的代码,来判断实例的创建是否有问题。

方法二、配置jvm参数,当项目发生内存溢出时自动打印内存快照信息,记录到文件中后续分析

首先,需要配置jvm的启动参数

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\mytest\oom\

这两个参数的意思是当发生OutOfMemoryError时,自动生成内存dump文件,并将文件保存到指定的目录下

以下是测试代码片段,设置jvm启动参数后运行

java内存溢出(OutOfMemoryError)问题排查

程序运行后内存溢出报错:

java内存溢出(OutOfMemoryError)问题排查

我么看到在指定的目录下生成了一个java_pid6572.hprof的文件,这就是内存快照文件,我们需要借助专门的工具来分析,分析工具有好几种,个人觉得Eclipse Memory Analyzer工具很好用,下载链接https://www.eclipse.org/mat/downloads.php

下载安装完成后通过MemoryAnalyzer.exe打开EMA工具,通过File-->Open Heap Dump打开刚才的.hprof文件,打开过程中的弹窗选项默认就好。

文件打开后,EMA会生成相应的视图:

java内存溢出(OutOfMemoryError)问题排查

视图中会给出可疑的问题信息,也可以通过点击【See stacktrace】查看内存溢出时的报错堆栈信息,有助于定位代码位置。

java内存溢出(OutOfMemoryError)问题排查

方法三、程序运行过程中,也可以dump出内存快照文件

首先,还是用jps获取java进程ID

java内存溢出(OutOfMemoryError)问题排查

然后,使用jmap生成内存文件

java内存溢出(OutOfMemoryError)问题排查

此方法生成的heap(自定义)文件,跟方法二中的.hprof文件是同一种文件,利用EMA工具可以分析内存使用情况。

 

java内存溢出(OutOfMemoryError)问题排查java内存溢出(OutOfMemoryError)问题排查 时十二分 发布了11 篇原创文章 · 获赞 0 · 访问量 656 私信 关注
上一篇:JVM常用命令


下一篇:JVM-18-JVM监控及诊断工具之命令行