2012-06-21 33 views
6

我不時在eclipse任務中運行,需要非常大的內存量。所以當任務運行時,jvm會吞下大約2-3GB的RAM,這沒關係。但是一旦jvm佔用了內存,它就不會釋放它,並且在堆中使用的內存大約爲200mb,總堆大小大約爲3gb,並且由於其他程序需要內存而非常不必要。我試過Max/MinHeapFreeRatio參數來強制jvm減少未使用內存的消耗這是我的日食config.ini文件:強制jvm返回本機內存

-startup 
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar 
--launcher.library 
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502 
-vm 
c:/Program Files/Java/jdk1.6.0_26/bin/javaw.exe 
-showlocation 
-product 
org.eclipse.epp.package.jee.product 
--launcher.defaultAction 
openFile 
--launcher.XXMaxPermSize 
256M 
-showsplash 
org.eclipse.platform 
--launcher.XXMaxPermSize 
256m 
--launcher.defaultAction 
openFile 
-vmargs 
-Duser.name=Michael Nesterenko 
-Dosgi.requiredJavaVersion=1.5 
-Xms512m 
-Xmx4096m 
-XX:MinHeapFreeRatio=10 
-XX:MaxHeapFreeRatio=30 

但是,這並沒有幫助,我仍然有情況下,當有大量未使用的內存。

+0

在啓動Eclipse時有兩個不同的快捷方式/ shell腳本是否可行,以及在需要執行內存密集型任務時使用不同的參數集? –

回答

4

Java作爲虛擬內存啓動時分配最大堆大小。因爲它使用內存,所以它被分配爲真正的主內存。它永遠不會縮小這個尺寸。釋放此內存的唯一方法是退出程序。

Java將壓縮其內存使用量,因此之前使用過的許多頁面都可以交換到磁盤上,但如果需要再次使用它們,性能可能會受到很大影響。

+5

我不同意。內存可以縮小。從此文檔(http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html):'-XX:MaxHeapFreeRatio = 70 \t爲避免收縮,在GC之後無堆堆的最大百分比。 '這意味着如果超過70%的堆空閒,堆將縮小。另外根據這個錯誤報告(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735):'如果不需要活動Java對象,HotSpot JVM已經將內存釋放回操作系統' –

+0

使用的堆將縮小,但是應用程序的常駐大小不會。 「我不知道這個bug評論員在說什麼。我從來沒有看到虛擬內存佔用空間縮小。 ' –

+0

實際上虛擬內存不是問題,它可以是任何大小,因爲它是私有的。我需要減少進程工作集 - 這是物理RAM使用量。 –

0

我建議您閱讀「stolsvik」關於此Java bug/rfe的第2條評論 - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735它在一定程度上解釋了-XX:MinHeapFreeRatio-XX:MaxHeapFreeRatio選項的工作原理。

如果這沒有幫助,你可以嘗試強制GC多次,看看是否觸發內存被釋放。然後打開GC日誌記錄來查看是否顯示任何內容。


可能會妨礙內存釋放的一個可能的問題是JVM分配非堆內存;例如對於線程堆棧,本地代碼堆或直接映射緩衝區。