我正在使用以下命令创建堆转储:
jmap -dump:file=DumpFile.txt <process-id>
我已经打开了生成的文件 -
DumpFile.txt
,但它不是可读格式。因此,请告诉我如何分析生成文件中的数据。您应该使用 jmap -heap:format=b <process-id>
命令,而不需要添加路径。这样就会创建一个*.bin文件,您可以使用与jmap相同的路径下的jvisualvm.exe
打开它。这是一个很好的工具,可以打开此类转储文件。
jhat
(Java Heap Analysis Tool)来读取生成的文件:jhat [ options ] <heap-dump-file>
jhat命令解析Java堆转储文件并启动Web服务器。jhat使您能够使用您喜欢的Web浏览器浏览堆转储。
请注意,您应该有一个二进制格式输出才能使用解析它。您可以使用选项以此格式生成转储。
-dump:format=b,file=<filename>
Reading from 447start.out... java.io.IOException: Unrecognized magic number: 1027423549 at com.sun.tools.hat.internal.parser.Reader.readFile(Reader.java:81) at com.sun.tools.hat.Main.main(Main.java:143)
这里的447start.out是日志文件的名称。 - Chaitanyaformat=b
选项进行转储,例如:jmap -dump:format=b,file=<filename>
。 - user2030471-XX:+HeapDumpOnOutOfMemoryError
JVM选项在服务器上生成了一个16Gb的堆转储,并且jhat
与之无缝配合。感谢这个好提示! - Elias Dorneles回答有些晚,但是值得快速浏览一下。只需要2分钟就可以详细了解。
首先创建这个Java程序。
import java.util.ArrayList;
import java.util.List;
public class GarbageCollectionAnalysisExample{
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
for (int i = 0; i < 100000000; i++) {
l = new ArrayList<String>(); //Memory leak
System.out.println(l);
}
System.out.println("Done");
}
}
使用 jps 命令查找虚拟机 ID(即 JVM ID)
打开命令提示符窗口,输入以下命令 >
C:\>jps
18588 Jps
17252 GarbageCollectionAnalysisExample
16048
2084 Main
17252是我们需要的vmid。
现在我们将学习如何使用jmap和jhat。
使用jmap - 生成堆转储
从Java文档中了解jmap “jmap打印给定进程、核心文件或远程调试服务器的共享对象内存映射或堆内存细节”
使用以下命令生成堆转储 >
C:\>jmap -dump:file=E:\heapDump.jmap 17252
Dumping heap to E:\heapDump.jmap ...
Heap dump file created
17252是vmid(从上面选取的)。
将在E:\heapDump.jmap
生成堆转储文件。
现在使用Jhat,Jhat用于分析Java中的垃圾回收转储文件 -
C:\>jhat E:\heapDump.jmap
Reading from E:\heapDump.jmap...
Dump file created Mon Nov 07 23:59:19 IST 2016
Snapshot read, resolving...
Resolving 241865 objects...
Chasing references, expect 48 dots................................................
Eliminating duplicate references................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
默认情况下,它会在7000端口启动http服务器。然后我们将转到http://localhost:7000/
VisualVm是不包含在Apple JDK中的。你可以使用VisualVM Mac Application bundle(dmg)这个独立应用程序来弥补这一点。
如果你只运行jmap -histo:live或jmap -histo,它会在控制台上输出内容!
如上面的大多数答案中提到的,您可以使用以下命令轻松进行堆转储:
jmap -dump:live,format=b,file=/path/to/mydump.hprof <pid>
<pid> - Java 进程 ID
使用图形化堆转储分析工具,例如 Eclipse MAT
,可以很容易理解你刚刚获取的内容。
你需要 Eclipse IDE
和 Memory Analyzer 插件
来开始使用。
更多详细信息请参阅this article。
jmap -heap <process-id> > DumpFile.txt
吗? - Felix Reckers