Eclipse的內(nèi)存優(yōu)化與內(nèi)存不足問題(轉(zhuǎn)貼)
Posted on 2010-06-26 21:37 笑看人生 閱讀(537) 評論(0) 編輯 收藏 所屬分類: Java插件開發(fā)原址地址:http://hi.baidu.com/dangjun625/blog/item/a0732c0845181ddc63d98666.html
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
eclipse根目錄下面的 eclipse.ini 配置 從網(wǎng)上搜了些資料
-vmargs:說明后面是VM的參數(shù)
-Xms128m:虛擬機占用系統(tǒng)的最小內(nèi)存
-Xmx512m:虛擬機占用系統(tǒng)的最大內(nèi)存的5%為25.6M,理論上要求-Xmx的數(shù)值與-XX:MaxPermSize必須大于25.6M
-XX:PermSize:最小堆大小。一般報內(nèi)存不足時,都是說這個太小, 堆空間剩余小于5%就會警告,建議把這個稍微設(shè)大一點,不過要視自己機器內(nèi)存大小來設(shè)置
-XX:MaxPermSize:最大堆大小。這個也適當大些
把里面的參數(shù)改為
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=128M
-XX:MaxPermSize=256M
問題解決!
從網(wǎng)上的資料看PermSize大一點肯定更好,而且最好是設(shè)置PermSize和MaxPermSize一樣大。理由如下:
PermSize 和MaxPermSize如果設(shè)置為相同還可以在一定程度上提高性能,因為,PermSize在不斷的變化中會需要轉(zhuǎn)移其中的數(shù)據(jù)。如果固定了以后,則可以減少每次擴大PermSize帶來的性能損失。
1、PermGen space簡介
PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域OutOfMemoryError: PermGen space從表面上看就是內(nèi)存益出,解決方法也一定是加大內(nèi)存。
說說為什么會內(nèi)存益出:
(1)這一部分用于存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區(qū)域,它和和存放Instance的Heap區(qū)域不同。
(2) GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS 的話,就很可能出現(xiàn)PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。
如果你的WEB APP下都用了大量的第三方j(luò)ar,其大小超過了jvm默認的大小(4M)那么就會產(chǎn)生此錯誤信息了。
解決方法: 手動設(shè)置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建議:將相同的第三方j(luò)ar文件移置到tomcat/shared/lib目錄下,這樣可以減少jar 文檔重復占用內(nèi)存
1。參數(shù)的含義
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
參數(shù)中-vmargs的意思是設(shè)置JVM參數(shù),所以后面的其實都是JVM的參數(shù)了,我們首先了解一下JVM內(nèi)存管理的機制,然后再解釋每個參數(shù)代表的含義。
堆(Heap)和非堆(Non-heap)內(nèi)存
按照官方的說法:“Java 虛擬機具有一個堆,堆是運行時數(shù)據(jù)區(qū)域,所有類實例和數(shù)組的內(nèi)存均從此處分配。堆是在 Java 虛擬機啟動時創(chuàng)建的。”“在JVM中堆之外的內(nèi)存稱為非堆內(nèi)存(Non-heap memory)”。可以看出JVM主要管理兩種類型的內(nèi)存:堆和非堆。簡單來說堆就是Java代碼可及的內(nèi)存,是留給開發(fā)人員使用的;非堆就是JVM留給自己用的,所以方法區(qū)、JVM內(nèi)部處理或優(yōu)化所需的內(nèi)存(如JIT編譯后的代碼緩存)、每個類結(jié)構(gòu)(如運行時常數(shù)池、字段和方法數(shù)據(jù))以及方法和構(gòu)造方法的代碼都在非堆內(nèi)存中。
堆內(nèi)存分配
JVM初始分配的內(nèi)存由-Xms指定,默認是物理內(nèi)存的1/64;JVM最大分配的內(nèi)存由-Xmx指定,默認是物理內(nèi)存的1/4。默認空余堆內(nèi)存小于40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內(nèi)存大于70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設(shè)置-Xms、-Xmx相等以避免在每次GC 后調(diào)整堆的大小。
非堆內(nèi)存分配
JVM使用-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認是物理內(nèi)存的1/64;由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認是物理內(nèi)存的1/4。
JVM內(nèi)存限制(最大值)
首先JVM內(nèi)存限制于實際的最大物理內(nèi)存,假設(shè)物理內(nèi)存無限大的話,JVM內(nèi)存的最大值跟操作系統(tǒng)有很大的關(guān)系。簡單的說就32位處理器雖然可控內(nèi)存空間有4GB,但是具體的操作系統(tǒng)會給一個限制,這個限制一般是2GB-3GB(一般來說Windows系統(tǒng)下為1.5G-2G,Linux系統(tǒng)下為2G-3G),而64bit以上的處理器就不會有限制了。
2. 為什么有的機器我將-Xmx和-XX:MaxPermSize都設(shè)置為512M之后Eclipse可以啟動,而有些機器無法啟動?
通過上面對JVM內(nèi)存管理的介紹我們已經(jīng)了解到JVM內(nèi)存包含兩種:堆內(nèi)存和非堆內(nèi)存,另外JVM最大內(nèi)存首先取決于實際的物理內(nèi)存和操作系統(tǒng)。所以說設(shè)置VM參數(shù)導致程序無法啟動主要有以下幾種原因:
1) 參數(shù)中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的總和超過了JVM內(nèi)存的最大限制,比如當前操作系統(tǒng)最大內(nèi)存限制,或者實際的物理內(nèi)存等等。說到實際物理內(nèi)存這里需要說明一點的是,如果你的內(nèi)存是1024MB,但實際系統(tǒng)中用到的并不可能是1024MB,因為有一部分被硬件占用了。
3. 為何將上面的參數(shù)寫入到eclipse.ini文件Eclipse沒有執(zhí)行對應的設(shè)置?
那為什么同樣的參數(shù)在快捷方式或者命令行中有效而在eclipse.ini文件中是無效的呢?這是因為我們沒有遵守eclipse.ini文件的設(shè)置規(guī)則:
參數(shù)形如“項 值”這種形式,中間有空格的需要換行書寫,如果值中有空格的需要用雙引號包括起來。比如我們使用-vm C:\Java\jre1.6.0\bin\javaw.exe參數(shù)設(shè)置虛擬機,在eclipse.ini文件中要寫成這樣:
-vm
C:\Java\jre1.6.0\bin\javaw.exe
按照上面所說的,最后參數(shù)在eclipse.ini中可以寫成這個樣子:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
實際運行的結(jié)果可以通過Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按鈕進行查看。
另外需要說明的是,Eclipse壓縮包中自帶的eclipse.ini文件內(nèi)容是這樣的:
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
其中–launcher.XXMaxPermSize(注意最前面是兩個連接線)跟-XX:MaxPermSize參數(shù)的含義基本是一樣的,我覺得唯一的區(qū)別就是前者是eclipse.exe啟動的時候設(shè)置的參數(shù),而后者是eclipse所使用的JVM中的參數(shù)。其實二者設(shè)置一個就可以了,所以這里可以把–launcher.XXMaxPermSize和下一行使用#注釋掉。
3. 其他的啟動參數(shù)。 如果你有一個雙核的CPU,也許可以嘗試這個參數(shù):
-XX:+UseParallelGC
讓GC可以更快的執(zhí)行。(只是JDK 5里對GC新增加的參數(shù))
補充:
可以在myelipse里選中相應的服務器比如tomcat5,展開里面的JDK子項頁面,來增加服務器啟動的JVM參數(shù)設(shè)置:
-Xms128m
-Xmx256m
-XX:PermSize=128M
-XX:MaxNewSize=256m
-XX:MaxPermSize=256m