2011-11-30 64 views
1

我是比較新的Java編程所以請多多包涵試圖瞭解是怎麼回事。Java內存使用率保持內最大堆大小不錯,但我的系統內存慢慢被吃掉

我開發的應用程序使用256MB的最大堆大小。隨着GC的完成,我從來沒有遇到過任何問題。當一個大圖像被加載並且在卸載時被很好地釋放時,所使用的堆會建立起來。內存不足錯誤是我還沒有看到的。

但是...運行應用程序大約一個小時。我注意到這個過程使用越來越多的系統內存,永遠不會被釋放。因此,應用程序從大約160MB開始,隨着堆大小的增長而增加,但是當堆大小縮小時,所使用的系統內存會越來越多。直到過程使用2.5GB,我的系統開始變慢。

現在我試圖瞭解倖存的一代位。堆的大小和倖存的一代似乎並沒有真正連接在一起?我的應用程序建立了許多幸存的世代,但根據應用程序本身使用的內存,我從未耗盡內存。但是JVM一直在吃內存,從不回饋給系統。

我在網上搜索周圍,有時會發現有些有用的信息。但我沒有得到的是應用程序保持在堆的大小範圍內,並且我的系統內存仍在被佔用。

這是怎麼回事?

我使用NetBeans IDE在OSX獅子與最新的JDK 1.6可用。

+0

您是否試過用VisualVM在您的應用程序中執行操作?它應該有一個工具來查看堆轉儲,也許知道哪些對象正在承擔老一代將會有所幫助。 – millimoose

+0

你確定你正在處理所有資源嗎?某些類(例如ImageReader)可以保存一些本地資源,當JVM中收集對象時,它們不會自動釋放。通常你需要使用finally-blocks來確保釋放這些資源。 – esaj

+0

所以你有一個256m的-Xmx但過程大小增長到2.5gb?哇。我從來沒有見過這種行爲。你使用多少個線程? – Gray

回答

3

開始會從JDK jvisualvm在同一臺機器上的最好辦法。附加到正在運行的程序並啓用分析。

另一種選擇是嘗試運行在調試模式下的應用程序,並在一段時間後停止檢查你的數據結構。這聽起來像一個破碎/怪異的做法,但通常如果你有內存泄漏,它會變得非常明顯。

祝你好運!

+0

我一直在使用NetBeans Profiler進行分析,它實際上與jvisualvm有點相同。 Windows PC上的堆大小遠低於64MB,而堆大小不受限制。在OSX上,堆大小現在增長到最大128MB。 但是......系統使用的內存仍然在不斷增長。根據剖析器,有幾代倖存下來的人,圖中倖存下來的幾代人不斷增長。這是一個動態應用程序。對象被創建並不斷拋棄。 – rkerstens