eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M eclipse根目錄下面的 eclipse.ini 配置 從網上搜了些資料 -vmargs:說明後面是VM的參數 -Xms128m:虛擬機器佔用系統的最小記憶體 -Xmx512m:虛擬機器佔用系統的最大記憶體的5%為25.6M,理論上要求-Xmx的數值與-XX:MaxPermSize 必須大於25.6M -XX:PermSize:最小堆大小。一般報記憶體不足時,都是說這個太小, 堆空間剩餘小於5%就會警告,建議把這個稍微設 大一點,不過要視自己機器記憶體大小來設定 -XX:MaxPermSize:最大堆大小。這個也適當大些 把裡面的參數改為 -vmargs -Xms128M -Xmx512M -XX:PermSize=128M -XX:MaxPermSize=256M 問題解決! 從網上的資料看PermSize大一點肯定更好,而且最好是設定PermSize和MaxPermSize一樣大。理由如下: PermSize 和MaxPermSize如果設定為相同還可以在一定程度上提高效能,因為,PermSize在不斷的變化中會需要轉移其中的資料。如果固定了以後,則可以減少每次擴大PermSize帶來的效能損失。 1、PermGen space簡介 PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存地區OutOfMemoryError: PermGen space從表面上看就是記憶體益出,解決方案也一定是加大記憶體。 說說為什麼會記憶體益出: (1)這一部分用於存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space地區,它和和存放Instance的Heap地區不同。 (2) GC(Garbage Collection)不會在主程式運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS 的話,就很可能出現PermGen space錯誤。這種錯誤常見在web伺服器對JSP進行pre compile的時候。 如果你的WEB APP下都用了大量的第三方jar,其大小超過了jvm預設的大小(4M)那麼就會產生此錯誤資訊了。 解決方案: 手動設定MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 建議:將相同的第三方jar檔案移置到tomcat/shared/lib目錄下,這樣可以減少jar 文檔重複佔用記憶體 1。參數的含義 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 參數中-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新增加的參數) 補充: 可以在myelipse裡選中相應的伺服器比如tomcat5,展開裡面的JDK子項頁面,來增加伺服器啟動的JVM參數設定: -Xms128m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m |