如何调试Java内存错误?

时间:2011-06-06 06:30:38

标签: java performance memory-leaks profiling

在Tomcat上运行了一个Java Struts应用程序,它有一些内存错误。有时它会变得缓慢并囤积Tomcat的所有内存,直到它崩溃。

我知道如何查找和修复“正常代码错误”,使用测试,调试等,但我不知道如何处理内存错误(我如何重现?我如何测试?有哪些地方?代码哪里更常见造成内存错误?)。

在一个问题中:我从哪里开始?感谢

编辑:

IT部门发出的快照(我没有直接访问生产应用程序)

enter image description here

5 个答案:

答案 0 :(得分:5)

使用众多“分析器”中的一个。它们挂钩到JVM中,可以告诉你每秒创建多少个新对象,以及它们是什么类型等等。

以下只是其中之一:http://www.ej-technologies.com/products/jprofiler/overview.html 我已经用过这个了,没关系。

答案 1 :(得分:1)

http://kohlerm.blogspot.com/ 如何使用eclipse内存分析器找到内存泄漏是非常好的介绍。

如果您更喜欢视频教程,请尝试youtube,虽然它是特定于Android的,但却非常有用。

答案 2 :(得分:0)

如果您的应用程序变得缓慢,您可以创建堆转储并将其与系统处于健康状况时创建的另一个堆转储进行比较。寻找更大数据结构的差异。

答案 3 :(得分:0)

您应该在profiler(例如jprofile或yourkit)下运行它一段时间,并查看内存/资源使用情况。还尝试进行线程转储。

答案 4 :(得分:0)

有几个选项分析器是其中之一,另一个是将java堆转储到文件并使用特殊工具进行分析(即IBM jvm提供了一个非常酷的工具,名为Memory Analizer,它提供了非常详细的分配内存报告在jvm崩溃的时候 - http://www.ibm.com/developerworks/java/jdk/tools/memoryanalyzer/)。 第三个选项是在启用jmx服务器的情况下启动服务器并通过JConsole连接到它,通过这种方法,您可以在运行时监视内存消息/分配。 JConsole在bin目录下提供了标准的sun jdk(这里你可以找到如何通过jconsole连接到tomcat - Connecting remote tomcat JMX instance using jConsole