參考:
http://hi.baidu.com/hero706309/blog/item/2b85988d3641b6e2503d922b.html
總結一下(http://howsun.blog.sohu.com/182790343.html)
--設定最大的堆和最小堆大小.兩者一樣表示固定大小.這樣可以防止老年代記憶體擴充造成額外的gc.當然也會多佔一些記憶體.系統記憶體不足的慎用
-Xms512m
-Xmx512m
--加大年輕代記憶體.減少minor gc
-Xmn164m
--這個是永久代大小.預設是64M,增加到96M.固定大小,減少擴充造成的gc
-XX:PermSize=96m
-XX:MaxPermSize=96m
--去除位元組碼驗證
-Xverify:none
--屏蔽顯示調用gc.
-XX:+DisableExplicitGC
--關閉類記憶體回收,就可以消除由於多次裝入和卸裝同一個類而造成的開銷
-Xnoclassgc
--指定最適合多任務並行的CMS垃圾收集器
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
--修改預設的觸發老年代full gc的記憶體所佔比..改成85%
-XX:CMSInitiatingOccupancyFraction=85
# 我的配置.-vm-C:\Java\jdk1.6.0_30\bin\javaw.exe-startupplugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar--launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810-productorg.eclipse.epp.package.jee.product--launcher.defaultActionopenFile--launcher.XXMaxPermSize128M-showsplashorg.eclipse.platform--launcher.XXMaxPermSize128m--launcher.defaultActionopenFile-vmargs-Dosgi.requiredJavaVersion=1.5-Xverify:none-XX:+DisableExplicitGC-Xms512M-Xmx512M-Xmn164m-XX:PermSize=96m-XX:MaxPermSize=96m-XX:+UseParallelGC-XX:CMSInitiatingOccupancyFraction=85
轉自:
http://blog.chinaunix.net/space.php?uid=10178376&do=blog&id=100985
-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新增加的參數)
堆大小設定
JVM 中最大堆大小有三方面限制:相關作業系統的資料模型(32-bt還是64-bit)限制;系統的可用虛擬記憶體限制;系統的可用實體記憶體限制。32位系統下,一般限制在1.5G~2G;64為作業系統對記憶體無限制。我在Windows Server 2003 系統,3.5G實體記憶體,JDK5.0下測試,最大可設定為1478m。
典型設定:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:設定JVM最大可用記憶體為3550M。
-Xms3550m:設定JVM促使記憶體為3550m。此值可以設定與-Xmx相同,以避免每次記憶體回收完成後JVM重新分配記憶體。
-Xmn2g:設定年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統效能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss128k:設定每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需記憶體大小進行調整。在相同實體記憶體下,減小這個值能產生更多的線程。但是作業系統對一個進程內的線程數還是有限制的,不能無限產生,經驗值在3000~5000左右。
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:設定年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設定為4,則年輕代與年老代所佔比值為1:4,年輕代占整個堆棧的1/5
-XX:SurvivorRatio=4:設定年輕代中Eden區與Survivor區的大小比值。設定為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6
-XX:MaxPermSize=16m:設定持久代大小為16m。
-XX:MaxTenuringThreshold=0:設定垃圾最大年齡。如果設定為0的話,則年輕代對象不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設定為一個較大值,則年輕代對象會在Survivor區進行多次複製,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
回收器選擇
JVM 給了三種選擇:串列收集器、並行收集器、並發收集器,但是串列收集器只適用於小資料量的情況,所以這裡的選擇主要針對並行收集器和並發收集器。預設情況下,JDK5.0以前都是使用串列收集器,如果想使用其他收集器需要在啟動時加入相應參數。JDK5.0以後,JVM會根據當前系統配置進行判斷。
輸送量優先的並行收集器
如上文所述,並行收集器主要以到達一定的輸送量為目標,適用於科學技術和幕後處理等。
以下轉自:
http://www.oschina.net/question/12_11854
A:JVM參數配置之heapsize
-Xmx
指定jvm的最大heap大小,如:-Xmx2g(千萬記住可是沒有等號的哦)
-Xms
指定jvm的最小heap大小,如:-Xms2g(千萬記住可是沒有等號的哦),高並發應用,建議和-Xmx一樣,防止因為記憶體收縮/突然增大帶來的效能影響,總之記住這遇見這兩值配一樣的數就OK。
-Xmn
指定jvm中NewGeneration的大小,如:-Xmn256m。這個參數會很影響效能的哦,所以要配置好,如果你的程式需要比較多的臨時記憶體,建議設定到512M,如果用的少,盡量降低這個數值,一般來說128/256足以使用了,配置得小gc效率就越快,系統效能也就得到提高,一般情況下跟據系統配到能接受的下限就OK。
-XX:PermSize=
指定jvm中PermGeneration的最小值,如:-XX:PermSize=32m。這個參數需要看你的實際情況。在生產環境中這個參數得需調試著才能拿到最准值,往往在應用中都會造成這一地區的記憶體溢出。
-XX:MaxPermSize=
指定(永久代)PermGeneration的最大值,如:-XX:MaxPermSize=64m
-Xss
指定線程桟大小,如:-Xss128k,一般來說,webx架構下的應用需要256K。如果你的程式有大規模的遞迴行為,請考慮設定到512K/1M。這個需要全面的測試才能知道。不過,256K已經很大了。這個參數對效能的影響比較大的。分配得少也就意味著你能多弄幾個線程出來,但還是得根據你的應用來拿拈了。
-XX:NewRatio=
指定jvm中OldGenerationheapsize與NewGeneration的比例,在使用CMSGC的情況下此參數失效,如:-XX:NewRatio=2
-XX:SurvivorRatio=
指定NewGeneration中EdenSpace與一個SurvivorSpace的heapsize比例,-XX:SurvivorRatio=8,那麼在總共NewGeneration為10m的情況下,EdenSpace為8m
-XX:MinHeapFreeRatio=
指定jvmheap在使用率小於n的情況下,heap進行收縮,Xmx==Xms的情況下無效,如:-XX:MinHeapFreeRatio=30
-XX:MaxHeapFreeRatio=
指定jvmheap在使用率大於n的情況下,heap進行擴張,Xmx==Xms的情況下無效,如:-XX:MaxHeapFreeRatio=70
-XX:LargePageSizeInBytes=
指定Javaheap的分頁頁面大小,如:-XX:LargePageSizeInBytes=128m
B:JVM參數配置garbagecollector
-XX:+UseParallelGC
指定在NewGeneration使用parallelcollector,並行收集,暫停appthreads,同時啟動多個記憶體回收thread,不能和CMSgc一起使用.系統噸吐量優先,但是會有較長長時間的apppause,後台系統任務可以使用此gc
-XX:ParallelGCThreads=
指定parallelcollection時啟動的thread個數,預設是物理processor的個數,
-XX:+UseParallelOldGC
指定在OldGeneration使用parallelcollector
-XX:+UseParNewGC
指定在NewGeneration使用parallelcollector,是UseParallelGC的gc的升級版本,有更好的效能或者優點,可以和CMSgc一起使用
-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC的情況下,盡量減少mark的時間
-XX:+UseConcMarkSweepGC
指定在OldGeneration使用concurrentcmarksweepgc,gcthread和appthread並行(在init-mark 和remark時pauseappthread).apppause時間較短,適合互動性強的系統,如webserver
-XX:+UseCMSCompactAtFullCollection
在使用concurrentgc的情況下,防止memoryfragmention,對liveobject進行整理,使memory片段減少
-XX:CMSInitiatingOccupancyFraction=
指示在oldgeneration在使用了n%的比例後,啟動concurrentcollector,預設值是68,如:-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
指示只有在oldgeneration在使用了初始化的比例後concurrentcollector啟動收集
C: 其他JVM參數配置
-XX:MaxTenuringThreshold=
指定一個對象(object)在經曆了n次(新生代區裡的GC)younggc後轉移到oldgeneration(老生代區),在linux64的java6下預設值是15,此參數對於throughputcollector無效,如:-XX:MaxTenuringThreshold=31
-XX:+DisableExplicitGC
禁止java程式中調用的fullgc,如System.gc()的調用。一般都會要配此參數以提高系統效能。
-XX:+UseFastAccessorMethods
把get,set方法轉成本地代碼
-XX:+PrintGCDetails
此參數用來打應垃圾收集的詳細情況
-XX:+PrintGCTimeStamps
打應垃圾收集的時間分部情況
-XX:+PrintGCApplicationStoppedTime
打應垃圾收集時,GC時導致的系統停頓時間
D:幾組GC對新舊代的回收方式列表:
指定方式 新生代GC方式 舊生代GC方式
-XX:+UseSerialGC 串列GC 串列GC
-XX:+UseParallelGC 並行回收GC 並行GC
-XX:+UseConeMarkSweepGC 並行GC 並發GC
-XX:+UseParNewGC 並行GC 串列GC
-XX:+UseParallelOldGC 並行回收GC 並行GC
-XX:+ UseConeMarkSweepGC
-XX:+UseParNewGC 串列GC 並發GC
不支援的組合 1、-XX:+UseParNewGC -XX:+UseParallelOldGC
2、-XX:+UseParNewGC -XX:+UseSerialGC
三種方式的拉圾回收總結:
串列收集:串列收集使用單線程處理所有記憶體回收工作,因為無需多線程互動,實現容易,而且效率比較高。但是,其局限性也比較明顯,即無法使用多處理器的優勢,適合單一處理器機器。
並行收集:並行收集使用多執行緒記憶體回收工作,因而速度快,效率高。而且理論上CPU數目越多,就會越能體現出並行收集器的優勢。
並發收集:相對於串列收集和並行收集而言,前面兩個在進行記憶體回收工作時,需要暫停整個運行環境(即只有GC一個線程在跑,其它的弟兄們都得停下手頭上的活來等著這兄弟執行完),因此,系統在記憶體回收時會有明顯的暫停,而且暫停時間會因為堆越大而越長。