剛剛做項目的時候,MyEclipse提示記憶體不足,我本本記憶體1G的呀。
錯誤提示大概如下:
MyEclipse has detected that less than 5% of the 64MB of Perm
Gen (Non-heap memory) space remains. It is strongly recommended
that you exit and restart MyEclipse with new virtual machine memory
paramters to increase this memory. Failure to do so can result in
data loss. The recommended Eclipse memory parameters are:
eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
以下是我的MyEclipse捷徑的參數:
"D:/Eclipse 3.2.2/eclipse.exe" -product com.genuitec.myeclipse.product.ide -vmargs -Duser.language=en -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -Dosgi.splashLocation="d:/MyEclipse 5.0GA/eclipse/MyEclipseSplash.bmp"
對於MyEclipse的話,直接修改MyEclipse在案頭的捷徑的參數就可以啦。現在解釋這些參數的意思。
-vmargs:說明後面是VM的參數
-Xms40m:虛擬機器佔用系統的最小記憶體
-Xmx256m:虛擬機器佔用系統的最大記憶體
-XX:PermSize:最小堆大小。一般報記憶體不足時,都是說這個太小,
堆空間剩餘小於5%就會警告,建議把這個稍微設
大一點,不過要視自己機器記憶體大小來設定
-XX:MaxPermSize:最大堆大小。這個也適當大些
-Xmx512M的5%為25.6M,理論上要求-Xmx的數值與-XX:MaxPermSize必須大於25.6M
把裡面的參數改為
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=128M
-XX:MaxPermSize=256M
所以對於我而言,我只要把我的MyEclipse5.0改-XX:PermSize=128M-XX:MaxPermSize=256M,問題解決!
eclipse啟動參數設定
直接右鍵eclipse的捷徑,在"目標"中填入下行
D:/eclipse/eclipse.exe -debug options -vm javaw.exe -nl en_US -clean -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -XX:MaxNewSize=32M -XX:NewSize=32M -Xms128m -Xmx256m
參數註解:
【-debug options -vm javaw.exe】 顯示JVM當前記憶體使用量量(註:詳見下方《讓你的eclipse也能顯示JVM當前記憶體使用量量》)
【-nl】後面跟的是語言:英語 en_US 簡體中文 zh_CN
【-clean 】是當啟動Eclipse IDE時清空緩衝,一般來說在沒有更新外掛程式的情況下,去掉這個參數啟動速度更快。
【-vmargs】使用JRE的參數,後面就是JRE的參數了:
【-Xverify:none】去掉JAR包資料驗證,一般來說只有在網路環境下才需要驗證JAR包資料的有效性。本地的話可以不用驗證。
【-XX:+UseParallelGC】使用並行垃圾收集機制,據說這個GC演算法比較快。具體不清楚。
【-XX:PermSize=20M -XX:MaxNewSize=32M -XX:NewSize=32M】這三個就是設定詳細的緩衝資料了。詳情看Java官方網站的介紹吧。
【-Xms128m】Java虛擬機器初始化記憶體容量。
【-Xmx256m】Java虛擬機器最大使用記憶體容量,根據你所使用機器的內容大小設定,只要不超過最大記憶體容量就好。
《讓你的eclipse也能顯示JVM當前記憶體使用量量》
1、在eclipse根目錄下建立一個檔案,檔案名稱options,檔案內容:org.eclipse.ui/perf/showHeapStatus=true
2、用這條命令啟動Eclipse:D:/eclipse/eclipse.exe -debug options -vm javaw.exe
或者直接右鍵eclipse的捷徑,在"目標"中填入這行。
3、啟動eclipse,就可以看到下面的狀態列會顯示當前JVM記憶體使用量量,另外還可以強制進行垃圾收集。
修改那個ini檔案是要注意,修改檔案之前一定要注意備份。
加啟動參數和在ini中寫是一樣的,都是啟動的配置。
eclipse對於jre的載入順序:首先執行 -vm 參數;如果沒有 -vm 參數,則尋找 eclipse/jre 子目錄;如果沒有找到,eclipse最後才尋找在系統中註冊的jre。
eclipse.ini記憶體設定
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
這裡有幾個問題:
1. 各個參數的含義什嗎?
2. 為什麼有的機器我將-Xmx和-XX:MaxPermSize都設定為512M之後Eclipse可以啟動,而有些機器無法啟動?
3. 為何將上面的參數寫入到eclipse.ini檔案Eclipse沒有執行對應的設定?
下面我們一一進行回答
1. 各個參數的含義什嗎?
參數中-vmargs的意思是設定JVM參數,所以後面的其實都是JVM的參數了,我們首先瞭解一下JVM記憶體管理的機制,然後再解釋每個參數代表的含義。
堆(Heap)和非堆(Non-heap)記憶體
按照官方的說法:“JAVA 虛擬機器具有一個堆,堆是運行時資料區域,所有類執行個體和數組的記憶體均從此處分配。堆是在 JAVA 虛擬機器啟動時建立的。”“在JVM中堆之外的記憶體稱為非堆記憶體(Non-heap memory)”。可以看出JVM主要管理兩種類型的記憶體:堆和非堆。簡單來說堆就是Java代碼可及的記憶體,是留給開發人員使用的;非堆就是JVM留給自己用的,所以方法區、JVM內部處理或最佳化所需的記憶體(如JIT編譯後的代碼緩衝)、每個類結構(如運行時常數池、欄位和方法資料)以及方法和構造方法的代碼都在非堆記憶體中。
堆記憶體配置
JVM初始分配的記憶體由-Xms指定,預設是實體記憶體的1/64;JVM最大分配的記憶體由-Xmx指定,預設是實體記憶體的1/4。預設空餘堆記憶體小於40%時,JVM就會增大堆直到-Xmx的最大限制;空餘堆記憶體大於70%時,JVM會減少堆直到-Xms的最小限制。因此伺服器一般設定-Xms、-Xmx相等以避免在每次GC 後調整堆的大小。
非堆記憶體配置
JVM使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;由XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。
JVM記憶體限制(最大值)
首先JVM記憶體限制於實際的最大實體記憶體(廢話!呵呵),假設實體記憶體無限大的話,JVM記憶體的最大值跟作業系統有很大的關係。簡單的說就32位處理器雖然可控記憶體空間有4GB,但是具體的作業系統會給一個限制,這個限制一般是2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統下為2G-3G),而64bit以上的處理器就不會有限制了。
2. 為什麼有的機器我將-Xmx和-XX:MaxPermSize都設定為512M之後Eclipse可以啟動,而有些機器無法啟動?
通過上面對JVM記憶體管理的介紹我們已經瞭解到JVM記憶體包含兩種:堆記憶體和非堆記憶體,另外JVM最大記憶體首先取決於實際的實體記憶體和作業系統。所以說設定VM參數導致程式無法啟動主要有以下幾種原因:
1) 參數中-Xms的值大於-Xmx,或者-XX:PermSize的值大於-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的總和超過了JVM記憶體的最大限制,比如當前作業系統最大記憶體限制,或者實際的實體記憶體等等。說到實際實體記憶體這裡需要說明一點的是,如果你的記憶體是1024MB,但實際系統中用到的並不可能是1024MB,因為有一部分被硬體佔用了。
3. 為何將上面的參數寫入到eclipse.ini檔案Eclipse沒有執行對應的設定?
那為什麼同樣的參數在捷徑或者命令列中有效而在eclipse.ini檔案中是無效的呢?這是因為我們沒有遵守eclipse.ini檔案的設定規則:
參數形如“項 值”這種形式,中間有空格的需要換行書寫,如果值中有空格的需要用雙引號包括起來。比如我們使用-vm C:/Java/jre1.6.0/bin/javaw.exe參數設定虛擬機器,在eclipse.ini檔案中要寫成這樣:
-vm
C:/Java/jre1.6.0/bin/javaw.exe
按照上面所說的,最後參數在eclipse.ini中可以寫成這個樣子:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
實際啟動並執行結果可以通過Eclipse中“Help”-“About Eclipse SDK”視窗裡面的“Configuration Details”按鈕進行查看。
另外需要說明的是,Eclipse壓縮包中內建的eclipse.ini檔案內容是這樣的:
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
其中–launcher.XXMaxPermSize(注意最前面是兩個連接線)跟-XX:MaxPermSize參數的含義基本是一樣的,我覺得唯一的區別就是前者是eclipse.exe啟動的時候設定的參數,而後者是eclipse所使用的JVM中的參數。其實二者設定一個就可以了,所以這裡可以把–launcher.XXMaxPermSize和下一行使用#注釋掉。
3. 其他的啟動參數。 如果你有一個雙核的CPU,也許可以嘗試這個參數:
-XX:+UseParallelGC
讓GC可以更快的執行。(只是JDK 5裡對GC新增加的參數)
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/xenron/archive/2010/03/17/5388069.aspx