Java堆内存溢出错误分析工具

4

我遇到了一个OutOfMemoryError: Java heap space的错误。

有没有什么工具可以帮助我找到根本原因?


1
是的,它们被称为分析器。作为建议,请使用Eclipse Memory Analyzer,也称为MAT。 - Luiggi Mendoza
你可以使用JDK自带的VisualVM,或者使用许多商业化调试工具之一,例如YourKit。 - Peter Lawrey
3个回答

6
你可以使用一些分析工具(例如eclipse mat)来分析应用程序的堆转储,以查看哪些部分占用了多少堆空间。但首先,您需要获取应用程序的堆转储。
为了在发生OOM错误时JVM自动生成堆转储文件,您可以使用-XX:+HeapDumpOnOutOfMemoryError选项。此外,您还可以使用-XX:HeapDumpPath选项告诉JVM生成文件的位置。
java -XX:HeapDumpPath="D:\heapdumps\YourApp.hprof" -XX:+HeapDumpOnOutOfMemoryError -jar YourApp.jar

一旦文件生成,您可以在MATLAB中打开并进行分析。
你也可以在应用程序运行时的任何时刻手动生成堆转储。为此,您可以使用随 jdk 一起提供的jmap命令。
jmap -dump:live,format=b,file="D:\heapdumps\YourApp.hprof" process_id_of_your_app

您可以使用附带在JDK中的jps工具,轻松地查找应用程序的进程ID。
jps -m

-XX:+HeapDumpOnOutOfMemoryError 是否也会转储Metaspace?如果不是,如何分析它? - ps0604

3
是的,它们被称为 分析器。市场上有很多选择。只需在分析器中加载JVM的内存转储文件,它将显示内存使用情况,并可以帮助您找出问题可能出现的地方。
JDK附带了 VisualVM ,自Java SE 7 u 40以来,您可以使用 Java Mission Control(免费许可证)。
作为个人建议,请使用 Eclipse Memory Analyzer,也称为 MAT(免费许可证)或 Yourkit(商业许可证)进行内存转储分析。
声明:我不与任何这些公司相关联。只是提供这些工具的快乐用户的信息。

3
请添加以下JVM参数,将垃圾回收的详细信息记录到日志文件中。
-Xloggc:gc_memory_logs.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

这个日志看起来会像这样:
1.703: [GC [PSYoungGen: 132096K->16897K(153600K)] 132096K->16905K(503296K), 0.0171210 secs] [Times: user=0.05 sys=0.01, real=0.01 secs] 
3.162: [GC [PSYoungGen: 148993K->21488K(153600K)] 149001K->22069K(503296K), 0.0203860 secs] [Times: user=0.04 sys=0.00, real=0.02 secs] 
4.545: [GC [PSYoungGen: 153584K->21484K(153600K)] 154165K->25309K(503296K), 0.0224490 secs] [Times: user=0.06 sys=0.01, real=0.02 secs] 
6.159: [GC [PSYoungGen: 153580K->21472K(285696K)] 157405K->33127K(635392K), 0.0271700 secs] [Times: user=0.08 sys=0.01, real=0.03 secs] 

一旦您拥有这个日志文件,您可以使用许多不同的工具(http://www.fasterj.com/tools/gcloganalysers.shtml)来分析日志。 其中一个工具是Garbagecat。https://code.google.com/a/eclipselabs.org/p/garbagecat/ 使用此工具,您可以分析日志,得到类似于以下结果的结果。
========================================
SUMMARY:
========================================
# GC Events: 18
GC Event Types: PARALLEL_SCAVENGE
Max Heap Space: 967680K
Max Heap Occupancy: 700911K
Max Perm Space: 0K
Max Perm Occupancy: 0K
Throughput: 100%
Max Pause: 82 ms
Total Pause: 582 ms
First Timestamp: 1703 ms
Last Timestamp: 56428185 ms
========================================
ANALYSIS:
========================================
========================================
0 UNIDENTIFIED LOG LINE(S):
========================================

一旦你知道结果,你可以相应地调整堆和永久内存设置。
例如,
-Xms512m -Xmx2g -XX:PermSize=512m  -XX:MaxPermSize=2g

除此之外,我们还可以使用JDK附带的其他有用工具,例如:
jvisualvm
jconsole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接