我们在App服务器中遇到内存不足的错误已经有一段时间了。我们看到已使用的堆大小逐渐增加,直到最终达到可用堆的大小。这每3周发生一次,之后需要重新启动服务器以修复此问题。通过对堆转储的分析,我们发现问题出在JSP中使用的对象。
JSP对象是Appserver内存问题的真正原因吗?我们如何释放JSP对象(使用usebean或其他标记实例化的对象)?
我们有一个带有2个节点和一个IHS的集群Websphere appserver。
编辑:上面的发现基于下面使用IBM support assistant给出的heap-dump和nativestderr日志分析
本地错误日志分析:
alt text http://saregos.com/wp-content/uploads/2010/03/chart.jpg
堆转储分析:
堆转储分析显示了直接主控者(上图中hastable条目的2个级别)
最后一幅图显示,直接主控器实际上是JSP中使用的对象。
EDIT2:在http://saregos.com/?p=43上提供更多信息
发布于 2010-03-29 15:30:27
手动触发垃圾收集并不能解决您的问题--它不会释放仍在使用的资源。
您应该使用分析工具(如jProfiler)来查找漏洞。如果使用代码将引用存储在列表或映射中,而这些列表或映射在运行时并未释放--可能是静态引用,则可能会出现问题。
发布于 2010-03-30 21:59:44
如果您在Sun6JVM下运行,请强烈考虑使用JDK中的jvisualvm程序来初步了解程序内部的实际情况。快照比较真的很好,可以帮助您进一步了解哪些对象会偷偷进入。
如果不选择Sun6JVM,那么请调查您拥有哪些性能分析工具。试验可以让你走得很远。
它可以是像在列表中收集的子字符串下面的巨大字符数组一样简单的东西,例如内务管理。
发布于 2010-03-31 18:46:23
我建议你读一读Effective Java, chapter 2。跟随它,再加上一个分析器,将帮助您识别应用程序产生内存泄漏的位置。
释放内存不是解决大量内存消耗的方法。大量的内存消耗可能是由两件事造成的:
Xmx、Xms、XX:MaxHeapSize、...来增加虚拟机内存
https://stackoverflow.com/questions/2507362
复制相似问题