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 -生成堆转储
来自java docs about jmap“jmap打印给定进程或核心文件或远程调试服务器的共享对象内存Map或堆内存详细信息”
使用以下命令生成堆转储>
C:\>jmap -dump:file=E:\heapDump.jmap 17252
Dumping heap to E:\heapDump.jmap ...
Heap dump file created
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.
7条答案
按热度按时间7fhtutme1#
您应该使用
jmap -heap:format=b <process-id>
,而不使用任何路径。因此它创建了一个 *.bin文件,您可以使用jvisualvm.exe
(与jmap相同的路径)打开该文件。这是一个伟大的工具来打开这样的转储文件。8nuwlpux2#
您可以使用
jhat
(Java堆分析工具)读取生成的文件:jhat命令解析java堆转储文件并启动web服务器。jhat使您能够使用您喜欢的web浏览器浏览堆转储。
请注意,您应该有一个
hprof
二进制格式的输出,以便能够用jhat
解析它。您可以使用format=b
选项生成这种格式的转储。iq0todco3#
很晚才回答这个问题,但值得快速浏览一下。只需要2分钟就能了解详细情况。
首先创建这个java程序
使用jps查找vmid(虚拟机ID,即JVM id)
转到CMD并在下面键入命令>
17252是我们需要的vmid。
现在我们将学习如何使用jmap和jhat
使用jmap -生成堆转储
来自java docs about jmap“jmap打印给定进程或核心文件或远程调试服务器的共享对象内存Map或堆内存详细信息”
使用以下命令生成堆转储>
其中17252是vmid(从上面选取)。
将在
E:\heapDump.jmap
中生成堆转储现在使用JhatJhat用于分析java中的垃圾收集转储-
默认情况下,它将在端口7000上启动http服务器。然后我们将转到http://localhost:7000/
礼貌:JMAP,How to monitor and analyze the garbage collection in 10 ways
zzlelutf4#
如果您使用Eclipse作为IDE,我推荐优秀的Eclipse插件memory analyzer
另一个选择是使用JVisualVM,它也可以读取(和创建)堆转储,并且每个JDK都附带。您可以在JDK的bin目录中找到它。
luaexgnf5#
VisualVm不随Apple JDK一起提供。您可以使用VisualVM Mac应用程序包(dmg)作为一个单独的应用程序,以弥补这一点。
u5rb5r596#
MAT、jprofiler、jhat是可能的选项。由于jhat是随jdk一起提供的,因此您可以轻松地启动它来进行一些基本分析。check this out
h7appiyu7#
如果您只是运行jmap -histo:live或jmap -histo,它会在控制台上输出内容!