如何调试Java内存错误?

3
有一个Java Struts应用程序在Tomcat上运行,出现了一些内存错误。有时它会变得缓慢并占用Tomcat的所有内存,直到崩溃。
我知道如何查找和修复“普通代码错误”,使用测试、调试等方法,但我不知道如何处理内存错误(如何重现?如何测试?哪些代码部分更容易创建内存错误?)。
换句话说,我该从哪里开始?谢谢
编辑:
IT部门发送的快照(我没有直接访问生产应用程序) enter image description here

1
它是如何崩溃的?有线程转储吗?异常堆栈跟踪? - Op De Cirkel
我添加了内存使用的快照。他们在任何异常堆栈跟踪之前重启服务器。 - Dr. No
通常问“我该从哪里开始?”的问题过于宽泛,不适合在这个网站上提问。每个人都有自己解决问题的方法,因此没有一个“正确”的答案。请仔细阅读从哪里开始并[编辑]您的帖子。 - double-beep
5个回答

5

+1 分析器可以解决可重现的错误。如果问题是可重现的,那么它就接近被修复了。 - Markus Lausberg
1
@Markus,我会说性能分析器可以帮助找到错误,但如果它们也能解决问题,我们所有人都将失业。 ;) - Peter Lawrey

1

http://kohlerm.blogspot.com/ 这是一个非常好的介绍,教你如何使用Eclipse Memory Analyzer查找内存泄漏。

如果你更喜欢视频教程,可以尝试youtube,虽然它是针对Android的,但非常有启发性。


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

0
你应该在一段时间内使用分析器(例如jprofile或yourkit)运行它,并查看内存/资源使用情况。另外,尝试生成线程转储。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接