如何在生产环境中调试java heap OutOfMemory错误?
我们的web应用程序在tomcat7中运行,我们使用的是java 1.7.055……在过去,当我们遇到问题时,我们能够在开发环境中使用Eclipse和分析器进行调试(我现在不记得这个名字)如何在生产环境中调试java heap OutOfMemory错误?,java,profiling,Java,Profiling,我们的web应用程序在tomcat7中运行,我们使用的是java 1.7.055……在过去,当我们遇到问题时,我们能够在开发环境中使用Eclipse和分析器进行调试(我现在不记得这个名字) 现在,我们的生产环境中出现了OutOfMemory异常。我对在生产环境中运行探查器非常谨慎,所以我的问题是……有没有办法在不使用探查器的情况下在生产环境中调试此问题,或者有没有重量足够轻的东西可以在生产环境中运行它?只需转储一堆生产服务器并使用Eclipse内存进行分析即可分析工具。您可以将heapdump复
现在,我们的生产环境中出现了OutOfMemory异常。我对在生产环境中运行探查器非常谨慎,所以我的问题是……有没有办法在不使用探查器的情况下在生产环境中调试此问题,或者有没有重量足够轻的东西可以在生产环境中运行它?只需转储一堆生产服务器并使用Eclipse内存进行分析即可分析工具。您可以将heapdump复制到本地服务器。是这项工作的最佳工具。然而,试图让UI远程运行是非常痛苦的。启动Eclipse和更新UI是JVM的额外负载,JVM已经在忙于分析30G堆转储。幸运的是,MAT附带了一个脚本,可以解析堆转储并生成HTML报告,而无需启动Eclipse
.设置更高的Xmx限制
-Xmx2048M或更多(如果需要)。如果您想在生产环境中评测应用程序,可以从生产系统中使用jConsole for real histogram。如果你能支付,你应该试试jProfiler()。这对于在生产环境中转储JVM数据非常有帮助。如果您非常关心在生产环境中运行探查器,请运行jmap-histo:live-pid 直方图是堆的汇总,它的权重非常小,为您生成数据所需的时间也非常少。如果没有设置HeapDumpOnAutofMemoryError,这将非常有用 在OOME上倒垃圾总是比较好的 Java提供了一个系统开关,通过标志-XX:+HeapDumpOnOutOfMemoryError来实现这一点。这将生成堆转储文件 堆转储文件包含其中所有与对象相关的信息。使用jhat可以很容易地对其进行分析。这将打开转储文件,分析数据,并监听控制台中显示的端口 如果配置了GC日志,请查看GC日志并确定内存消耗显著增加的时间。从日志中尝试识别tomcat完成的操作/处理的请求,检查代码并尝试识别代码中是否存在任何内存泄漏。您可以使用直方图作为参考,因为histo还提供对象计数 如果在应用程序中使用某些缓存,请检查为缓存配置的最大大小,或者是否定期清除缓存 希望这是有帮助的