2008-10-08 120 views
4

通常,我在IBM Websphere Application Server上发现OutOfMemoryException。 我认为发生这种异常是因为我的应用程序从数据库中检索到巨大的数据。所以,我限制所有查询的WAS遵循IBM Websphere OutOfMemoryException

+ 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) 

而且我发现堆转储的javacore卡在Profiles文件夹中的文件我认为他们可以不retreive数据超过1000条记录,并设置JVM告诉我关于问题的原因,但我不知道如何读取/使用heapdump,javacore和快照文件。

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

回答

1

对此的回答取决于与OutOfMemoryException关联的消息。您也可以尝试-XX:MaxPermSize = ...并将其设置为更大的像256m。另外,如果你在某处有递归函数,那可能会导致堆栈溢出。

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

+0

OK,我会再试一次:d – 2008-10-09 17:40:46

3

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

0

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

0

我假设你使用hibernate/JPA作为持久性提供者?你在使用二级缓存吗?如果是的话,你是否考虑从缓存中逐出大量结果集?

0

的问题是很难回答,如果我们不知道它是什么样的 OutOfMemoryError异常的; permgenheapspace是两个截然不同的野兽。

我在JBoss上追逐了几个月的perm-gen,虽然那种特殊类型的问题对于任何重新加载web应用程序的应用程序服务器来说都是通用的。传奇被记录在here

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