作項目的時候,MyEclipse提示內存不足。
錯誤提示大概以下:
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,問題解決!
(我的補充一點:參數在你安裝的exlipse目錄下的eclipse.ini文件中)java
這一段時間,Eclipse老是死掉,幾乎是稍微操做快一點就會死掉,幾分鐘一次,搞得人鬱悶至極。浪費了很多時間,在網上搜了下,看到不少朋友也出現類 似的狀況,在網上求救,可是網上的辦法都只是說經過修改eclipse.ini文件來加大Eclipse的內存。
本身試了下,發現無論用。今天,又死掉了,不過爆出一個常常出現的錯誤,大意是:permgen space致使內存溢出。實在忍無可忍,上網一搜,發現網絡真是個好東西,尤爲是對咱們這種自學者而言,無疑是授業解惑的良師益友。
這裏總結一下本身的經驗和網友的經驗,但願可以對受此問題折磨的朋友有所參考價值。
解決辦法以下:
在eclipse.ini配置文件中加上如下兩行
-XX:PermSize=128M
-XX:MaxPermSize=128M
加上上2行後,個人eclipse.ini文件以下所示:
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
-vmargs
-Xms256m
-Xmx512m
-XX:PermSize=128M
-XX:MaxPermSize=128M
這裏的內存大小根據本身的物理內存狀況來決定吧。
從網上的資料看PermSize大一點確定更好,並且最好是設置PermSize和MaxPermSize同樣大。理由以下:
PermSize 和MaxPermSize若是設置爲相同還能夠在必定程度上提升性能,由於,PermSize在不斷的變化中會須要轉移其中的數據。若是固定了之後,則能夠減小每次擴大PermSize帶來的性能損失。
一、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.sh,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入如下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建議:將相同的第三方jar文件移置到tomcat/shared/lib目錄下,這樣能夠減小jar 文檔重複佔用內存web
-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新增長的參數)tomcat
補充:服務器
能夠在myelipse裏選中相應的服務器好比tomcat5,展開裏面的JDK子項頁面,來增長服務器啓動的JVM參數設置:網絡
-Xms128m
-Xmx256m
-XX:PermSize=128M
-XX:MaxNewSize=256m
-XX:MaxPermSize=256mless
原文: http://blog.csdn.net/xx_liuhui/article/details/4355199eclipse