2009-08-19 37 views
1

目前我想分析Java的Web应用程序。我将Netbeans Profiler与Eclipse结合使用。我的服务器(Tomcat)通过eclipse插件运行,并使用Netbeans分析器动态连接到服务器。如何分析和理解输出一个Java Web应用程序

我有一个主要的问题,那之后的某个服务器上的环境中运行内存不足。我读到内存泄漏,我意识到,有两种方式:1。 大对象坐在记忆停留未收集,并导致内存泄漏或 2.小物件不断收到在存储器中而不被收集分配。

虽然第二个是通常很难找到,一个通常的症状是过了一段时间后,幸存的垃圾收集gerenerations将不断增加,而不论转速。它似乎发生在我的网络应用程序,虽然没有活动真的发生。世代在一段时间内稳步增加,无一例外。迫使我认为我有一些应该被垃圾收集的参考物体。

我跑了探查测试,但不幸的是我真的不明白是怎么针点的对象。我注意到,即使我多次收集垃圾,一个特定的HASHMAP的涌现次数一直在增加。

我附上一个简单的截屏给人的我在开始应用的未来几年分钟看到了一个非常简要的概述。

我将不胜感激,如果你能指出我出一些真正的文章等,这会指教我如何使分析意识,它是什么,我应该去了解这样做,以确保我抓住罪魁祸首。

任何帮助,非常感谢。

查找连接的屏幕截图。 alt text http://dl.getdropbox.com/u/1264228/Files/State.png

回答

1

检测任何应用程序内存泄漏(Java或者没有),最好的办法是采取的记忆定期快照,当应用程序在使用,后跟该对象的仔细检查计数的不同类型的对象由应用程序管理。

大多数内存泄漏可以追溯到一组显示内存消耗增幅最大的对象。简而言之,与ΣMEM(物体)相反,应该优先考虑ΔMEM(物体)。

一旦你已经确定了一组负责对泄漏的对象,然后需要查明泄漏源,通过对象分配跟踪。

有关如何使用Netbeans完成此操作的快速介绍,您可以查看Java Passion上的其中一个教程。

在Eclipse中,您会发现MAT插件描述支配树的能力非常有用。

最后,下列用语的名单将是有益的,因为有效的分析,需要对这些知识作为先决条件:

1

我通常每隔几秒就会看到一些heapdump,以查看正在发布的内容以及可能存在的问题。

然后我深入到那些可疑,发现是什么阻碍对它们引用的对象。通常归结为某些资源未被正确关闭,会话对象的过度使用,静态变量,某些类加载器中的泄漏,内存缓存或仍在引用的列表中的某些对象。

这不是一件容易的经历,虽然成千上万的对象,并解释这是怎么回事。我发现JavaPassion上的这个course对初学者非常有帮助。