我们将WebSphere应用程序服务器用于我们的应用程序,并且我们经常出现内存不足错误。为了调试这个,我们添加了日志以检查某些地方的已用内存,下面是观察结果。
使用的内存在达到阈值限制之前不会减少。我们使用以下内存配置:
InitialHeapSize="1024" maximumHeapSize="2048"
因此,直到它超过1024,内存才会被释放。在OOM错误的情况下,即使某些线程未被使用,也不会释放内存。
我认为没有释放堆大小。但java Runtime API显示有可用的内存。类似于方法类,字符串操作的Java操作正在运行,但是当使用outofmemory异常进行JNDI查找时,它会失败。结果,由于无法连接,系统失败。
堆栈追踪:
com.ibm.websphere.naming.CannotInstantiateObjectException:JNDI NamingManager处理javax.naming.Reference对象时发生异常。 [根异常是java.lang.OutOfMemoryError] at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:1033) 在com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookup(Helpers.java:730)
答案 0 :(得分:1)
Dynamo,您必须执行堆分析以找出导致OOM的原因。它是一个免费的工具,可以让您找出导致服务器问题的原因。可能是一个流氓应用程序阻塞了太多的内存或资源泄漏了太多的内存等。
您可以查看此信息以获取更多信息。你想要调整你的初始堆和最大堆的设置(如果你有太深的GC,那么你的CPU在GC期间会非常高,如果太频繁就会出现持续的开销使用问题)
答案 1 :(得分:1)
您需要通过Heap Dump
生成Thread Dump
和wasadmin
并分析根本原因
答案 2 :(得分:0)
根据您使用的平台和版本会有一些差异,但是,内置支持生成堆转储:
例如见:
通常,您要么启用堆转储的生成,然后强制执行OOM,然后使用HeapAnalyzer分析生成的堆转储。或者,您可以在看到大量内存使用时手动生成堆。
一些警告:内存泄漏看起来可能是一个非常大但瞬态的内存使用。随着时间的推移,需要查看内存使用情况,以确定存在实际泄漏。
无论如何,处理此类问题的路径不可避免地导致生成堆转储并进行分析。