关于项目中出现OutOfMemoryError错误问题排查分析,可以根据实际情况使用不同的方法
方法一、项目运行过程中,监控jvm内存使用情况,发现异常
首先利用jps命令查看jvm进程ID
这里的OomTest类是我Eclipse中运行的main方法所在的类,以此为例。
然后利用jmap命令查看目前堆中对象的统计信息
jmap -histo [pid] 命令可以列出内存中对象的统计信息,包括实例个数、内存使用以及类名,并按照内存使用大小自动排序,根据打印结果,我们可以清晰看到,目前内存中到底是谁使用了大量内存,上面结果中我们看到TestObject对象实例数很高,这样我们就可以找到项目中该类使用的代码,来判断实例的创建是否有问题。
方法二、配置jvm参数,当项目发生内存溢出时自动打印内存快照信息,记录到文件中后续分析
首先,需要配置jvm的启动参数
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\mytest\oom\
这两个参数的意思是当发生OutOfMemoryError时,自动生成内存dump文件,并将文件保存到指定的目录下
以下是测试代码片段,设置jvm启动参数后运行
程序运行后内存溢出报错:
我么看到在指定的目录下生成了一个java_pid6572.hprof的文件,这就是内存快照文件,我们需要借助专门的工具来分析,分析工具有好几种,个人觉得Eclipse Memory Analyzer工具很好用,下载链接https://www.eclipse.org/mat/downloads.php。
下载安装完成后通过MemoryAnalyzer.exe打开EMA工具,通过File-->Open Heap Dump打开刚才的.hprof文件,打开过程中的弹窗选项默认就好。
文件打开后,EMA会生成相应的视图:
视图中会给出可疑的问题信息,也可以通过点击【See stacktrace】查看内存溢出时的报错堆栈信息,有助于定位代码位置。
方法三、程序运行过程中,也可以dump出内存快照文件
首先,还是用jps获取java进程ID
然后,使用jmap生成内存文件
此方法生成的heap(自定义)文件,跟方法二中的.hprof文件是同一种文件,利用EMA工具可以分析内存使用情况。
时十二分 发布了11 篇原创文章 · 获赞 0 · 访问量 656 私信 关注