2012-04-28 37 views
2

我一直在用多個模塊在Java上開發這個項目。由於相當一段時間,我偶爾會得到「java:Out Of Memory」錯誤!我對這個'流行'錯誤相當陌生,並且想知道一般方法來解決這樣的錯誤。
另外,有沒有標準工具行業接受,以幫助找出這種錯誤的原因?
我的項目中的模塊包括來自第三方(使用web服務)的每分鐘輪詢多線程等等。然而,這只是一個指針,我尋求一個通用的方法,而不是我的項目特定的東西。
謝謝。java:通常的解決內存不足錯誤的方法

回答

3

有時你只是有一個類使用大量的內存,你需要增加堆的大小,或者做一個更節省空間的算法。其他時候,這是一個泄漏,你需要尊重對象。

  1. 運行jvisualvm(它包含在JDK中)。
  2. 連接到您的進程並嘗試是否可以重新創建 內存不足錯誤,同時關注堆大小。
  3. 當內存變大時執行堆轉儲。按大小搜索最大的對象 - 通常這會給你導致類的罪魁禍首 。
  4. 看看依賴關係,看看持有引用。如果是內存泄漏,請確保取消引用不需要的對象。
2

另外,有沒有行業接受的標準工具來幫助找出這種錯誤的原因?

是的,有內存分析器,如VisualVMYourKit。我廣泛使用後者,用於CPU和內存分析,並發現它非常有用。想了解它的能力,看看這個頁面:link

1

如果您不能增加可用內存,則必須消耗更少的內存。

不要保留對執行時不需要的對象的引用(如可以動態重新加載的數據),並在必要時重新設計流(例如,不要並行處理所有對象並按順序執行)當時需要更少的內存。垃圾收集應該爲你做剩下的工作。

尤其是如果您將大數據對象加載到內存中,請考慮在可能的情況下使用流式方法。例如。如果您想要搜索整個文件,則無需將整個文件加載到內存中。你可以單步穿過它。

除了建築問題,你也可以有泄漏:保持無意中引用你不再需要的對象。由於它們被引用,垃圾回收器無法釋放內存,並且在某個時刻內存不足。這可能是OutOfMemoryExceptions的第一個原因,它通常與static引用有關,因爲類是第一次觸碰某個類後static通常不是unloaded。互聯網上有許多關於查找/修復這些文章的文章,例如How to Fix Memory Leaks in Java

一個工具,我知道的是MAT

0

您可能有內存泄漏。發現它是一個挑戰。 Netbeans有一些工具可以幫助您分析虛擬機。您可以分析您的項目並在運行時查看男性使用情況。 Apache JMeter也可作爲插件使用,也可以自行運行。 JMeter.apache.org

0

如果你OOM過於頻繁,然後用正確的選項啓動Java,獲得一個堆轉儲與或與jHat從日食內存分析器分析它(http://www.eclipse.org/mat/)

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>