如何在java中使用jmap分析堆转储
我正在使用下面的命令创build堆转储:
jmap -dump:file=DumpFile.txt <process-id>
我已经打开生成的文件 – DumpFile.txt,但它不是可读的格式。 所以,请让我知道如何分析生成的文件中的数据。
你应该使用没有任何path的jmap -heap:format=b <process-id>
。 因此它会创build一个* .bin文件,您可以使用jvisualvm.exe
(与jmap相同的path)打开该文件。 这是一个很好的工具来打开这样的转储文件。
您可以使用jhat
(Java堆分析工具)来读取生成的文件:
jhat [ options ] <heap-dump-file>
jhat命令parsing一个java堆转储文件并启动一个web服务器。 jhat使您能够使用您最喜爱的浏览器浏览堆转储。
请注意,你应该有一个hprof
二进制格式输出,以便能够parsing它与jhat
。 您可以使用format=b
选项以这种格式生成转储。
-dump:format=b,file=<filename>
如果你使用Eclipse作为IDE,我会推荐优秀的eclipse插件内存分析器
另一个select是使用JVisualVM,它也可以读取(和创build)堆转储,并随每个JDK一起提供。 您可以在您的JDK的bin目录中find它。
VisualVm不附带Apple JDK。 您可以使用VisualVM Mac应用程序包(dmg)作为单独的应用程序来弥补这一点。
答案很晚,但值得一看。 只需2分钟就能详细了解。
首先创build这个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查找vmid(虚拟机ID即JVM id)
转到CMD并键入下面的命令>
C:\>jps 18588 Jps 17252 GarbageCollectionAnalysisExample 16048 2084 Main
17252是我们需要的vmid。
现在我们将学习如何使用jmap和jhat
使用jmap – 生成堆转储
从关于jmap的java文档“jmap打印给定进程或核心文件或远程debugging服务器的共享对象内存映射或堆内存详细信息”
使用以下命令生成堆转储>
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 /
礼貌: JMAP , 如何用10种方式监控和分析垃圾回收
MAT,jprofiler,jhat是可能的select。 因为jhat自带jdk,你可以轻松启动它来做一些基本的分析。 看一下这个