如何释放记忆?

sar*_*ego 17 java websphere memory-leaks out-of-memory

我们的App服务器有一段时间以来一直面临Out of Memory错误.我们看到使用的堆大小逐渐增加,直到最终达到可用堆的大小.这种情况每3周发生一次,之后需要重新启动服务器才能解决此问题.在分析堆转储时,我们发现问题是JSP中使用的对象.

JSP对象能否成为Appserver内存问题的真正原因?我们如何释放JSP对象(使用usebean或其他标签实例化的对象)?

我们有一个具有2个节点和IHS的集群Websphere应用服务器.

编辑:上面的发现是基于下面给出的使用IBM支持助手的堆转储和nativestderr日志分析

nativestd错误日志分析:

alt text http://saregos.com/wp-content/uploads/2010/03/chart.jpg

堆转储分析:

![alt text] [2]

堆转储分析显示直接支配者(上图中可稳定条目的2级)

![alt text] [3]

最后一张图显示了直接支配者实际上是在JSP中使用的对象.

EDIT2:更多信息,请访问http://saregos.com/?p=43

jef*_*ter 8

我首先附上一个配置文件工具来告诉你这些"对象"占用了所有内存.

Eclipse有TPTP,或者有JProfiler或JProbe.

其中任何一个都应该显示对象堆刷新并允许您检查它以查看堆上的内容.

然后搜索代码库以查找创建这些代码的人员.

也许您有一个包含元素的缓存或树/地图对象,并且您只在这些对象上实现了"equals()"方法,并且您需要实现"hashcode()".这将导致map/cache/tree变得越来越大,直到它倒下.这只是猜测.

JProfiler将是我的第一个电话

Javaworld有内存中的内容的示例屏幕截图...

替代文字http://www.javaworld.com/javaworld/jw-08-2003/images/jw-0822-profiler16.gif

并且对象堆构建和清理的屏幕截图(因此锯边缘)

替代文字http://www.javaworld.com/javaworld/jw-08-2003/images/jw-0822-profiler19.gif

更新*************************************************

好的,我看看......

http://www-01.ibm.com/support/docview.wss?uid=swg1PK38940

堆使用量随着时间的推移而增加,从而导致OutOfMemory条件.对heapdump的分析表明以下对象占用了越来越多的空间:

40,543,128 [304] 47班

com/ibm/wsspi/rasdiag/DiagnosticConfigHome 40,539,056 [56] 2 java/util/Hashtable 0xa8089170 40,539,000 [2,064] 511 java/util/Hashtable数组$ Entry 6,300,888 [40] 3 java/util/Hashtable $ HashtableCacheHashEntry


Dan*_*ner 7

手动触发垃圾收集并不能解决您的问题 - 它不会释放仍在使用的资源.

您应该使用分析工具(如jProfiler)来查找泄漏.您可以使用代码来存储在运行时期间未发布的列表或映射中的引用 - 可能是静态引用.