我们的网络应用程序在tomcat7中运行,我们正在使用java 1.7.0_55 ....过去当我们遇到问题时,我们已经能够使用Eclipse和分析器在我们的开发环境中进行调试(这个名字让我逃脱了。)
现在我们在生产环境中获得OutOfMemory异常。我非常谨慎在生产环境中运行分析器,所以我的问题是......有没有办法在不使用分析器的情况下在生产环境中调试此问题,或者是否有足够轻量级的东西可以运行它在生产中?
答案 0 :(得分:2)
只需要进行生产服务器的堆转储&使用Eclipse Memory分析工具分析它。您可以将heapdump复制到本地。 Eclipse Memory Analyzer是这项工作的最佳工具。但是,尝试让UI远程运行非常痛苦。启动Eclipse并更新UI是JVM上的一个额外负载,它已经忙于分析30G堆转储。幸运的是,MAT附带了一个脚本来解析堆转储并生成HTML报告,而无需启动Eclipse!
答案 1 :(得分:1)
如果要在生产环境中分析应用程序,可以使用jConsole从生产系统中获取真实的直方图。如果你可以付款,你应该尝试jProfiler(https://www.ej-technologies.com/products/jprofiler/overview.html)。它非常有助于在生产环境中转储JVM数据。
答案 2 :(得分:1)
如果您非常关心在生产环境中运行探查器,请运行jmap -histo:live pid
直方图是堆的摘要,它的重量非常轻,只需要很少的时间为您生成数据。如果你没有设置HeapDumpOnOutOfMemoryError,这将是很有用的。
最好在OOME上进行堆转储 Java通过标志-XX提供了一个系统开关:+ HeapDumpOnOutOfMemoryError这将生成堆转储文件。
堆转储文件包含其中的所有对象相关信息。可以使用jhat轻松分析。这将打开转储文件并分析数据并侦听将在控制台中显示的端口。
如果配置了GC日志,请查看GC日志并确定从内存消耗显着增加的时间。从日志中尝试识别tomcat处理的操作/请求,查看代码并尝试确定代码中是否存在任何内存泄漏。您可以使用直方图作为参考,因为histo也提供了对象计数。
如果您在应用程序中使用某些缓存,请检查为缓存配置的最大大小是什么,或者是否定期清除缓存....
希望这有用。
答案 3 :(得分:-2)
设置更高的Xmx限制。
-Xmx2048M或更多,如果需要。