如何在生产环境中调试 java heap OutOfMemory 错误?
Posted
技术标签:
【中文标题】如何在生产环境中调试 java heap OutOfMemory 错误?【英文标题】:How to debug a java heap OutOfMemory error in a production environment? 【发布时间】:2015-05-14 04:35:49 【问题描述】:我们的 Web 应用程序在 tomcat7 中运行,并且我们使用的是 java 1.7.0_55....过去,当我们遇到问题时,我们可以使用 Eclipse 和分析器在我们的开发环境中进行调试(名字现在让我忘记了)。
现在我们在生产环境中遇到了 OutOfMemory 异常。我对在生产环境中运行探查器持怀疑态度,所以我的问题是......有没有办法在生产环境中调试这个问题而不使用探查器,或者是否有足够轻量级的东西我可以运行它在生产中吗?
【问题讨论】:
【参考方案1】:只需对生产服务器进行堆转储并使用 Eclipse 内存分析工具对其进行分析。您可以将堆转储复制到本地。 Eclipse Memory Analyzer 是完成这项工作的最佳工具。然而,试图让 UI 远程运行是非常痛苦的。启动 Eclipse 和更新 UI 是 JVM 上的额外负载,它已经忙于分析 30G 堆转储。幸运的是,MAT 附带了一个脚本来解析堆转储并生成 html 报告,而无需启动 Eclipse!
Check this out.
【讨论】:
【参考方案2】:如果您想在生产环境中分析您的应用程序,您可以使用 jConsole 获取生产系统中的真实直方图。如果你能付钱,你应该试试 jProfiler (https://www.ej-technologies.com/products/jprofiler/overview.html)。它对于在生产环境中转储JVM的数据非常有帮助。
【讨论】:
【参考方案3】:如果您非常关心在生产环境中运行分析器,请运行 jmap -histo:live pid
直方图是堆的摘要,它的重量非常轻,为您生成数据所需的时间非常少。如果您没有设置 HeapDumpOnOutOfMemoryError,这将非常有用。
在 OOME 上进行堆转储总是更好 Java 通过标志 -XX:+HeapDumpOnOutOfMemoryError 提供了一个系统开关来执行此操作,这将生成堆转储文件。
堆转储文件中包含所有对象相关信息。可以使用 jhat 轻松分析它。这将打开转储文件并分析数据并监听将显示在控制台中的端口。
如果配置了 GC 日志,请查看 GC 日志并确定内存消耗显着增加的时间。从日志中尝试识别您的 tomcat 已完成的操作/处理的请求,检查代码并尝试识别代码中是否存在任何内存泄漏。您可以使用直方图作为参考,因为 histo 也提供对象计数。
如果您在应用程序中使用了一些缓存,请检查为缓存配置的最大大小是多少,或者是否定期清除缓存......
希望这有帮助。
【讨论】:
【参考方案4】:设置更高的 Xmx 限制。
-Xmx2048M 或更多(如果需要)。
【讨论】:
以上是关于如何在生产环境中调试 java heap OutOfMemory 错误?的主要内容,如果未能解决你的问题,请参考以下文章
阿里Java诊断工具 arthas - 生产环境反编译动态修改程序调试应用