一個可以參考的JVM記憶體分配

FrankYou發表於2018-08-24

 下面是java命令有關JVM記憶體分配的引數

JAVA_MEM_OPTS=""
BITS=`java -version 2>&1 | grep -i 64-bit`
if [ -n "$BITS" ]; then
    JAVA_MEM_OPTS=" -server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
else
    JAVA_MEM_OPTS=" -server -Xms1g -Xmx1g -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
fi

 

1、64位 Server VM:

 引數  引數說明
-server 伺服器模式
-Xmx2g JVM最大的堆記憶體大小為2G。Xmx預設為實體記憶體的1/4但小於1G
-Xms2g JVM啟動初始化堆大小為2G,Xms的預設是實體記憶體的1/64但小於1G。Xms等於Xmx,好處是避免每次gc後,調整堆的大小,減少系統記憶體分配開銷
-Xmn256m JVM堆中的新生代大小為256M
-XX:PermSize=128m JVM持久代的初始化大小為128M
-Xss256k 每個執行緒的棧大小為256k
-XX:+DisableExplicitGC 這個將會忽略手動呼叫GC的程式碼,使得 System.gc()的呼叫就會變成一個空呼叫,完全不會觸發任何GC。
-XX:+UseConcMarkSweepGC 開啟此引數使用ParNew & CMS(serial old為替補)蒐集器。如果配置了CMS GC的方式,那麼新生代預設採取的就是ParNew GC的方式
-XX:+CMSParallelRemarkEnabled 降低標記停頓
-XX:+UseCMSCompactAtFullCollection 在FULL GC的時候壓縮記憶體。CMS是不會移動記憶體的,因此這個非常容易產生碎片導致記憶體不夠用,因此記憶體的壓縮這個時候就會被啟用。 增加這個引數是個好習慣。 
-XX:LargePageSizeInBytes=128m 記憶體頁的大小, 不可設定過大, 會影響Perm的大小。 
-XX:+UseFastAccessorMethods 快速呼叫成員方法。什麼方法叫做AccessorMethods,①必須是成員方法,靜態方法不行,②返回值型別必須是引用型別或者int,其它都不算,③方法體的程式碼必須滿足aload_0; getfield #index; areturn或ireturn這樣的模式,方法名是什麼都沒關係,是不是get、is、has開頭都不重要。 因為此類方法方法體很簡單,而且沒有方法計數器,開啟此設定後可以跳過對該類方法的編譯。該設定預設在jdk6中是開啟的,但由於jdk7的server模式預設開啟了多層編譯,此時在這種多臺方法呼叫時甚至會導致效能下降,jdk7好像是預設關閉的。
-XX:+UseCMSInitiatingOccupancyOnly  命令JVM不基於執行時收集的資料來啟動CMS垃圾收集週期。而是,當該標誌被開啟時,JVM通過CMSInitiatingOccupancyFraction的值進行每一次CMS收集,而不僅僅是第一次。然而,請記住大多數情況下,JVM比我們自己能作出更好的垃圾收集決策。因此,只有當我們充足的理由(比如測試)並且對應用程式產生的物件的生命週期有深刻的認知時,才應該使用該標誌。
-XX:CMSInitiatingOccupancyFraction=70  當堆滿之後,並行收集器便開始進行垃圾收集,例如,當沒有足夠的空間來容納新分配或提升的物件。對於CMS收集器,長時間等待是不可取的,因為在併發垃圾收集期間應用持續在執行(並且分配物件)。因此,為了在應用程式使用完記憶體之前完成垃圾收集週期,CMS收集器要比並行收集器更先啟動。因為不同的應用會有不同物件分配模式,JVM會收集實際的物件分配(和釋放)的執行時資料,並且分析這些資料,來決定什麼時候啟動一次CMS垃圾收集週期。為了引導這一過程, JVM會在一開始執行CMS週期前作一些線索查詢。該線索由-XX:CMSInitiatingOccupancyFraction=<value>來設定,該值代表老年代堆空間的使用率。比如,value=75意味著第一次CMS垃圾收集會在老年代被佔用75%時被觸發。通常CMSInitiatingOccupancyFraction的預設值為68(之前很長時間的經歷來決定的)。

 

 2、32位 Server VM

可以參考上表,指標的值有所不同。

 3、關於Partial GC和Full GC


Partial GC:並不收集整個GC堆的模式
Young GC:只收集新生代的GC,比如收集器:ParNew
Old GC:只收集老年代的GC,比如收集器:CMS
Mixed GC:收集整個新生代以及部分老年代的GC,只有G1有這個模式


Full GC:收集整個堆
包括新生代、老年代、持久代(如果存在的話)等所有部分的模式。

相關文章