通常,我在IBM Websphere Application Server上发现了OutOfMemoryException。 我认为发生此异常是因为我的应用程序从数据库中检索大量数据。因此,我限制所有查询不要检索超过1000条记录的数据并设置WAS的JVM遵循

+ Verbose garbage collection
+ Maximum Heap size = 1024 (RAM on my server is 16 GB and now I already change to 8192)
+ Debug arguments = -Djava.compiler=NONE -Xdebug -Xnoagent  
                    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777
+ Generic JVM arguments = -Dsun.rmi.dgc.server.gcInterval=60000 
                          -Dsun.rmi.dgc.client.gcInterval=60000 -Xdisableexplicitgc  
                          -Dws.log=E:\WebApp\log -Dws.log.level=debug
(ws.log and ws.log.level are my properties)

我在个人资料文件夹中找到 heapdump javacore snap 文件我认为他们可以告诉我有关问题的原因但我不知道我知道如何读取/使用heapdump,javacore和snap文件。

请告诉我如何防止/避免/修复OutOfMemoryException。 感谢

有帮助吗?

解决方案

答案取决于与OutOfMemoryException相关联的消息。您也可以尝试-XX:MaxPermSize = ...并将其设置为更大的值,如256m。

此外,如果你在某处有一个递归函数,那可能会导致堆栈溢出。

如果可以,请发布与例外相关的消息。 Stacktrace也可能有所帮助。

其他提示

如果要查看堆转储文件,IBM提供了分析它们的工具这里

“感谢内存”是关于JVM使用内存的好文章,这可能有助于分析这个问题......

感谢 bwalliser 提供此链接

尝试在本地重现问题,以便您可以使用JProfiler等工具对其进行调试。即使你不能在本地强制使用OOM,你也可能会看到JProfiler中的内存增加。然后,您拍摄快照并查找未进行垃圾回收的类。这不是一门精确的科学,但它比查看IBM heapdump要容易得多。但是,如果必须,检查堆转储的旧方法是使用HeapRoots。这可能取决于您所使用的版本。我知道IBM JDK的某些版本存在压缩问题,所以即使你有足够的内存,你也可以获得一个OOM,因为没有足够大的片段可供使用。

我假设您使用hibernate / JPA作为持久性提供程序?你在使用二级缓存吗?如果是这样,您是否考虑从缓存中驱逐大型结果集?

如果我们不知道OutOfMemoryError的是什么,那么这个问题很难回答; permgen heapspace 是两种非常不同的野兽。

我在JBoss上追逐了几个月的perm-gen,尽管这种特殊类型的问题对于任何动态重新加载Web应用程序的应用程序服务器都是通用的。该传奇文件记录在此处

您拥有的那些堆转储......可能是您可以在 Eclipse MAT

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top