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