我是比較新的Java編程所以請多多包涵試圖瞭解是怎麼回事。Java內存使用率保持內最大堆大小不錯,但我的系統內存慢慢被吃掉
我開發的應用程序使用256MB的最大堆大小。隨着GC的完成,我從來沒有遇到過任何問題。當一個大圖像被加載並且在卸載時被很好地釋放時,所使用的堆會建立起來。內存不足錯誤是我還沒有看到的。
但是...運行應用程序大約一個小時。我注意到這個過程使用越來越多的系統內存,永遠不會被釋放。因此,應用程序從大約160MB開始,隨着堆大小的增長而增加,但是當堆大小縮小時,所使用的系統內存會越來越多。直到過程使用2.5GB,我的系統開始變慢。
現在我試圖瞭解倖存的一代位。堆的大小和倖存的一代似乎並沒有真正連接在一起?我的應用程序建立了許多幸存的世代,但根據應用程序本身使用的內存,我從未耗盡內存。但是JVM一直在吃內存,從不回饋給系統。
我在網上搜索周圍,有時會發現有些有用的信息。但我沒有得到的是應用程序保持在堆的大小範圍內,並且我的系統內存仍在被佔用。
這是怎麼回事?
我使用NetBeans IDE在OSX獅子與最新的JDK 1.6可用。
您是否試過用VisualVM在您的應用程序中執行操作?它應該有一個工具來查看堆轉儲,也許知道哪些對象正在承擔老一代將會有所幫助。 – millimoose
你確定你正在處理所有資源嗎?某些類(例如ImageReader)可以保存一些本地資源,當JVM中收集對象時,它們不會自動釋放。通常你需要使用finally-blocks來確保釋放這些資源。 – esaj
所以你有一個256m的-Xmx但過程大小增長到2.5gb?哇。我從來沒有見過這種行爲。你使用多少個線程? – Gray