【发布时间】:2011-01-31 05:32:34
【问题描述】:
一段时间以来,我们的应用服务器一直面临内存不足错误。我们看到已用堆大小逐渐增加,直到最终达到可用堆大小。这种情况每 3 周发生一次,之后需要重新启动服务器来解决此问题。 通过对堆转储的分析,我们发现问题出在 JSP 中使用的对象。
JSP 对象会是 Appserver 内存问题的真正原因吗?我们如何释放 JSP 对象(使用 usebean 或其他标签实例化的对象)?
我们有一个带有 2 个节点和一个 IHS 的集群 Websphere 应用服务器。
编辑:上面的发现是基于下面使用 IBM 支持助手给出的 heap-dump 和 nativestderr 日志分析
nativestd err 日志分析:
alt text http://saregos.com/wp-content/uploads/2010/03/chart.jpg
堆转储分析:
![替代文字][2]
显示直接支配者的堆转储分析(上图中的 hastable 条目的 2 级)
![替代文字][3]
最后一张图片显示直接支配者实际上是在 JSP 中使用的对象。
EDIT2:更多信息请访问http://saregos.com/?p=43
【问题讨论】:
-
我记得一个与部署未预编译的 JSP 相关的旧内存泄漏问题。 sun 编译器存在内存泄漏,JSP 在被引用时正在动态编译,这最终导致内存不足错误。解决方案是在部署之前预编译 JSP。
-
但在我们的例子中,堆耗尽是逐渐的......内存在 3 周内耗尽。这似乎不是预编译问题。此外,我们会预编译我们的 JSP
-
3 周 - 无论在应用程序中做了什么?你使用任何与计时器相关的东西吗?听起来像是一个没有正确释放的周期性动作。
-
如果您使用的是最新版本的 Java,请确保使用包含的 VisualVM 进行分析...您可以拍摄正在创建的对象的快照,这对于调试这些对象非常有用东西。
-
Ahhh...www-01.ibm.com/support/docview.wss?uid=swg1PK38940 出现内存泄漏 .... 堆使用量随着时间的推移而增加,这会导致 OutOfMemory 情况。对堆转储的分析表明,以下对象占用的空间越来越多: 40,543,128 [304] 47 class com/ibm/wsspi/rasdiag/DiagnosticConfigHome 40,539,056 [56] 2 java/util/Hashtable 0xa8089170 40,539,000 [2,064] 511 数组java/util/Hashtable$Entry 0xaac7ef20 6,300,888 [40] 3 java/util/Hashtable$HashtableCacheHashEntry
标签: java memory-leaks websphere out-of-memory