2013-02-12 55 views
0

一個對象,我的工作對Spring Web MVC框架和最近遇到java.lang.OutOfMemoryError:Java堆空間。何時取消引用的Java Web MVC

所以,我正在閱讀有關它,我所做的主要錯誤是,我不推定使用的對象。所以GC不會清理大量的內存。

現在的問題是,當取消對它的引用。

這裏是基本向外流動:

From front end user sends a request 

server calls a library with the users request 

library returns it a big chunk of array of results. 

server forwards it to front end. 

現在直到此時我不能解除引用結果數組作爲我需要的結果對象。我對麼 ? 因此,當用戶發送新的請求時,我應該清理結果數組並用新請求調用庫。

另外我用-XX:+ HeapDumpOnOutOfMemoryError獲取轉儲文件。但我沒有看到項目文件夾中的轉儲文件。在日誌中我看到創建了轉儲文件。有沒有人遇到這種情況。

+0

你在哪裏保持結果數組?你把它放在'Session'中,還是一些可比較的內存緩存?因爲如果不是的話,只要請求完成,它就會自動成爲垃圾收集的候選對象。 – aroth 2013-02-12 04:32:14

+0

您是否嘗試過增加堆大小? -Xmx3g應該給一束呼吸室(3G = 3場音樂會) – 2013-02-12 05:06:52

回答

1

通常用於這種類型的問題的解決方案是:

  1. (明顯的),使用-Xmx增加最大堆設置,獲得更大的硬件。這個方法可能不是可擴展的,但可以提供短期解決問題的方法
  2. 問問自己,你真的需要大塊?如果不嘗試請求較小的塊,而是保存堆使用率。確保你不再持有對象的引用。只要你知道你的變量不再需要,將它設置爲null,以便它們可以被垃圾收集。
+0

我用視覺VM看被多少內存消耗。我發現內存使用量正在逐漸增加。我假設我不是在引用一些對象。我是對的 – javaMan 2013-02-12 14:05:23

+0

最有可能的是。如果你的代碼是健康的,內存圖應該看起來像鋸齒,而不會隨着時間的推移而顯着增加。檢查哪些類實例正在填充堆,並查看是否可以釋放對這些對象的引用,以便GC可以清理更多 – gerrytan 2013-02-12 21:34:02

+0

我看到這些行。但無法找到轉儲文件:java.lang.OutOfMemoryError:Java堆空間 將堆轉儲到java_pid728.hprof ... 已創建堆轉儲文件[在4.174秒中爲[199269982個字節]]。任何想法它會去。我正在使用eclipse。 – javaMan 2013-02-12 21:55:21

1

如果沒有http://sscce.org/這將是非常困難的幫助你。 JVM爲你做GC,如果你的對象有明確的範圍,他們應該自動獲得GCed。

我會建議通過增加堆內存搞清楚你啓動這些:

什麼結果數組的範圍(全球或僅限於方法調用層次即通過方法調用堆棧傳遞到弗朗端)?

如果它具有全局作用域,它是單例實例的一部分還是每個請求實例創建的?哪些對象存儲在Result數組中,是否引用了代碼中的其他任何地方?

您可以可以使用與jHat獲取對象引用圖並找出還有誰被引用的對象(免責聲明:這將導致混亂,如果存儲陣列中的對象包含對其他對象&引用這通常是這種情況)

Better ways to identify objects not getting garbage collected?