大多数时候,在企业应用程序中,给定的Java堆大于理想的最大大小(最大12至16 GB)。我发现很难使NetBeans Profiler直接在这些大型Java应用程序上工作。
但是通常不需要。您可以使用jdk附带的jmap实用程序进行“实时”堆转储,即jmap将在运行GC之后转储堆。对应用程序执行一些操作,等待操作完成,然后进行另一个“活动”堆转储。使用诸如Eclipse MAT之类的工具加载堆转储,对直方图进行排序,查看哪些对象增加了,或者哪些对象增加了,这将提供线索。
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
这种方法只有一个问题。即使使用live选项,巨大的堆转储也可能太大而无法转移到开发阶段,并且可能需要一台具有足够内存/ RAM的机器才能打开。
这就是类直方图出现的地方。您可以使用jmap工具转储实时类的直方图。这只会给出类的内存使用情况的直方图,基本上不会有链接参考的信息。例如,可以将char数组放在顶部。和String类在下面的某个地方。您必须自己绘制连接。
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
像上面所述,不取两个堆转储,而是取两个类直方图。然后比较类别直方图,并查看正在增加的类别。查看是否可以将Java类与应用程序类相关联。这将给出一个很好的提示。这是一个Python脚本,可以帮助您比较两个jmap直方图转储。histogramparser.py
最后,诸如JConolse和VisualVm之类的工具对于查看内存随时间的增长以及查看是否存在内存泄漏至关重要。最后,有时您的问题可能不是内存泄漏,而是内存使用率很高。为此,启用GC日志记录;使用更高级和新的压缩GC(例如G1GC);您可以使用jstat之类的jdk工具实时查看GC行为
jstat -gccause pid <optional time interval>
有关-jhat,jmap,Full GC,Humongous分配,G1GC的其他Google参考