2008-10-08 119 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中分析它們。