--設置最大的堆和最小堆大小.兩者一樣表示固定大小.這樣可以防止老年代內存擴展造成額外的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
- -startup
- plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
- --launcher.library
- plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810
- -product
- org.eclipse.epp.package.jee.product
- --launcher.defaultAction
- openFile
- --launcher.XXMaxPermSize
- 128M
- -showsplash
- org.eclipse.platform
- --launcher.XXMaxPermSize
- 128m
- --launcher.defaultAction
- openFile
- -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一個線程在跑,其它的弟兄們都得停下手頭上的活來等着這兄弟執行完),因此,系統在垃圾回收時會有明顯的暫停,而且暫停時間會因為堆越大而越長。