4

我经常在 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)

我在配置文件文件夹中找到了 heapdumpjavacoresnap文件,我认为它们可以告诉我问题的原因,但我不知道如何阅读/使用 heapdump、javacore 和 snap 文件。

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

4

6 回答 6

3

如果您想查看堆转储文件,IBM在此处提供了分析它们的工具。

于 2008-10-08T14:45:40.113 回答
1

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

此外,如果您在某处有递归函数,则可能会导致堆栈溢出。

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

于 2008-10-08T14:34:40.073 回答
1

“Thanks for the memory”是一篇关于JVM使用内存的好文章,可能有助于分析这个问题......

感谢bwalliser提供此链接

于 2009-05-19T08:12:56.273 回答
0

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

于 2008-10-08T17:13:52.140 回答
0

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

于 2008-10-09T15:10:17.630 回答
0

如果我们不知道这是什么类型的 OutOfMemoryError,这个问题就很难回答;是两种截然不同的野兽permgenheapspace

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

您拥有的那些堆转储......可能是您可以在Eclipse MAT中分析它们。

于 2008-10-09T23:32:49.377 回答