如何在生产环境中调试 java heap OutOfMemory 错误?

How to debug a java heap OutOfMemory error in a production environment?

我们的网络应用程序 运行 在 tomcat7 中运行,我们正在使用 java 1.7.0_55...在过去,当我们遇到问题时,我们已经能够使用 Eclipse 和分析器在我们的开发环境中进行调试(我现在忘记了这个名字)。

现在我们在生产环境中遇到了 OutOfMemory 异常。我对在生产环境中使用分析器 运行 持怀疑态度,所以我的问题是......是否有任何方法可以在生产环境中调试此问题而不使用分析器,或者是否有一些轻量级的东西足以让我 运行 投入生产了吗?

只需获取生产服务器的堆转储并使用 Eclipse 内存分析工具对其进行分析。您可以将堆转储复制到本地。 Eclipse Memory Analyzer 是这项工作的最佳工具。但是,尝试将 UI 远程设置为 运行 是非常痛苦的。启动 Eclipse 并更新 UI 是 JVM 的额外负载,它已经忙于分析 30G 堆转储。幸运的是,MAT 附带了一个脚本来解析堆转储并生成 HTML 报告,而无需启动 Eclipse!

Check this out.

设置更高的 Xmx 限制。

-Xmx2048M 或更多(如果需要)。

如果您想在生产环境中分析您的应用程序,您可以使用 jConsole 从您的生产系统中获取真实的直方图。如果你能付钱,你应该试试 jProfiler (https://www.ej-technologies.com/products/jprofiler/overview.html)。对生产环境转储JVM数据很有帮助

如果您非常关心 运行在生产环境中使用分析器 运行 jmap -histo:live pid

直方图是堆的摘要,它的重量很轻,为您生成数据所需的时间也很短。如果您没有设置 HeapDumpOnOutOfMemoryError,这将很有用。

在 OOME 上进行堆转储总是更好 Java 通过标志 -XX:+HeapDumpOnOutOfMemoryError 提供一个系统开关来执行此操作,这将生成堆转储文件。

堆转储文件包含所有与对象相关的信息。可以使用 jhat 轻松分析它。这将打开转储文件并分析数据并监听将在控制台中显示的端口。

如果配置了 GC 日志,请查看 GC 日志并确定内存消耗显着增加的时间。从日志中尝试识别由您的 tomcat 处理的操作 done/requests,检查代码并尝试识别代码中是否存在任何内存泄漏。您可以使用直方图作为参考,因为 histo 也提供对象计数。

如果您在应用程序中使用某些缓存,请检查为缓存配置的最大大小是多少,或者是否定期清除缓存....

希望对您有所帮助。