2015-05-14 48 views
5

我们的web应用程序在tomcat7中运行,我们正在使用java 1.7.0_55 ....在过去,当我们遇到问题时,我们已经能够在我们的开发环境中使用Eclipse和Profiler(名称目前逃脱我)。如何在生产环境中调试java堆OutOfMemory错误?

现在我们在生产环境中出现OutOfMemory异常。我很在意在生产环境中运行一个profiler,所以我的问题是......有没有什么办法可以在生产环境中调试这个问题,而不需要使用profiler,或者是否有足够轻量的东西可以运行它在生产?

回答

2

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

Check this out

-2

设置较高的Xmx限制。

-Xmx2048M或更多,如果需要。

1

如果你是在运行的生产环境中的探查运行JMAP -histo非常关注:活PID

直方图是堆的总结,它很精简版的重量,并会采取非常少的时间来生成数据为你。如果你没有设置HeapDumpOnOutOfMemoryError,这将会很有用。

它总是更好地承担OOME Java提供了一个系统的开关通过标志来做到这一点-XX堆转储:+ HeapDumpOnOutOfMemoryError这将产生堆转储文件。

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

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

如果您使用的应用程序中的一些缓存检查什么是配置缓存最大大小,或者是高速缓存定期清除....

希望这是有帮助的。

相关问题