问题
java.lang.OutOfMemoryError: Java heap space
排查
排查手段
- jmap命令
jmap -dump,format=b,file=<file-path> <pid>
比如 jmap -dump:format=b,file=./heap.hprof 44532
- 使用JVisualVM工具: JVisualVM是一个图形界面工具,它可以帮助监控和分析Java应用程序。通过JVisualVM可以生成堆转储。
- 设置HeapDumpOnOutOfMemoryError: 在运行Java应用程序时,可以设置JVM参数
-XX:+HeapDumpOnOutOfMemoryError
和-XX:HeapDumpPath=<file-path>
,这样当JVM遇到内存溢出错误时,会自动生成堆转储文件。
比如
-Xmx60m -Xms60m -XX:NewRatio=1 -XX:MaxTenuringThreshold=3 -XX:SurvivorRatio=6 -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="D:/heap-dump.hprof"
参数解释:
-XX:NewRatio=1 老年代: 新生代是1:1 也就是各30MB 正常为2,老年代40 新生代20
-XX:MaxTenuringThreshold=3 晋升老年代的阈值
-XX:SurvivorRatio=6 eden:from:to = 6:1:1
堆 Dump 文件是一个二进制文件,记录了堆内存中对象的详细信息,包括对象的类型、大小、引用关系等。
dump文件分析
- 使用内存分析工具:
- VisualVM:连接到JVM进程,查看内存使用情况,分析内存泄漏。
- Eclipse Memory Analyzer (MAT):分析堆转储文件,找出内存泄漏的根源。
jvisualvm 没法识别, 需要用到 MAT(注意要和自己的JDK版本对应上,否则会出现MAT软件无法启动的问题)
或者直接用 VisualVM