天天看點

【JVM】jvm參數分析

一、常用參數

-Xms:初始堆。預設是實體記憶體的1/64(<1gb) 。預設(MinHeapFreeRatio參數可以調整)空餘堆小于40%事,JVM就會增大堆直到-Xmx的最大限制.

-Xmx:最大堆。預設值是實體記憶體的1/4(<1gb)。預設(MaxHeapFreeRatio參數可調整)空餘堆記憶體大于70%時,JVM會減少堆直到-Xms的最小限制.

-Xmn:年輕代大小。 此處的大小是(eden + 2 survivor space).與jmap -heap中顯示的New gen是不同的。

整個堆大小=年輕代+年老代大小+持久代大小。

持久代一般固定大小為64m,是以增大年輕代後,将會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8

-Xss:設定每個線程的大小。JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256k。根據應用的線程所需記憶體大小進行調整。在相同實體記憶體下,減小這個值能生成更多的線程。但是作業系統對一個程序内的線程數還是有限制的,不能無限生成,經驗值在3000-5000左右

-XX:PremSize:持久代(方法區)的初始記憶體大小(-XX:PremSize=64m.  實體記憶體的1/64)(Java 8就沒了被-XX:MatespaceSize替代啦)

-XX:MaxPremSize:持久代(方法區)的最大記憶體大小(-XX:MaxPremSize=512. 實體記憶體的1/4)(Java 8就沒了)

-XX:NewSize:年輕代大小

-XX:MaxNewSize:年輕代最大值

-XX:+UseSerialGC:串行(SerialGC)是jvm的預設GC方式,一般适用于小型應用和單處理器,算法比較簡單,GC效率也比較高,但可能會給應用帶來停頓。

-XX:+UserParallelGC:并行(ParallelGC)是指多個線程并行執行GC,一般适用于多處理器系統中,可以提高GC的效率,但算法複雜,系統消耗較大。(配合使用:-XX:ParallelGCThreads=8,并行收集器的線程數,此值最好配置與處理器數目相等)

-XX:+UseParNewGC:設定年輕代為并行收集。JKD5.0以上,JVM會根據系統配置自行設定,是以無需設定此值。

-XX:+UseParalllelOldGC:設定年老代為并行收集,JDK6.0出現的自選參數選項。

-XX:+UseConcMarkSweepGC:并發(ConcMarkSweepGC)是指GC運作時,對應用程式運作幾乎沒有影響(也會造成停頓,不過影響很小),GC和app兩者的線程在并發執行,這樣可以最大限度不影響app的運作。

-XX:+UseCMSCompactAtFullCollection:在Full GC的時候,對老年代進行壓縮整理。因為CMS是不會移動記憶體的,是以非常容易産生記憶體碎片。是以增加這個參數就可以在FullGC後對記憶體進行壓縮整理,消除記憶體碎片。當然這個操作也有一定缺點,就是會增加CPU開銷與GC時間,是以可以通過-XX:CMSFullGCsBeforeCompaction=3 這個參數來控制多少次Full GC以後進行一次碎片整理。

-XX:CMSInitiatingOccupancyFraction=80:代表老年代使用空間達到80%後,就進行Full GC。CMS收集器在進行垃圾收集時,和應用程式一起工作,是以,不能等到老年代幾乎完全被填滿了再進行收集,這樣會影響并發的應用線程的空間使用,進而再次觸發不必要的Full GC。

-XX:+MaxTenuringThreshold=10:垃圾的最大年齡,代表對象在Survivor區經過10次複制以後才進入老年代。如果設定為0,則年輕代對象不經過Survivor區,直接進入老年代。

-XX:MetaspaceSize:元空間的初始大小是21M,如果啟動後GC過于頻發,可以設定的大一些,一般設定的是256M

-XX:MaxMetaspaceSize:元空間的最大值預設是無限大,一般設定與-XX:MetaspaceSize大小一樣。

(tips:

   -XX:MetaspaceSize=256m

的含義到底是什麼呢?其實,這個JVM參數是指Metaspace擴容時觸發FullGC的初始化門檻值,也是最小的門檻值。這裡有幾個要點需要明确:

  1. 如果沒有配置

    -XX:MetaspaceSize

    ,那麼觸發FGC的門檻值是21807104(約20.8m),可以通過jinfo -flag MetaspaceSize pid得到這個值;jps -v也可以檢視jvm的參數設定情況。
  2. 如果配置了

    -XX:MetaspaceSize

    ,那麼觸發FGC的門檻值就是配置的值;
  3. Metaspace由于使用不斷擴容到

    -XX:MetaspaceSize

    參數指定的量,就會發生FGC;且之後每次Metaspace擴容都可能會發生FGC(至于什麼時候會,比較複雜,跟幾個參數有關);
  4. 如果Old區配置CMS垃圾回收,那麼擴容引起的FGC也會使用CMS算法進行回收;
  5. 如果MaxMetaspaceSize設定太小,可能會導緻頻繁FullGC,甚至OOM;)

-XX:+ExplicitGCInvokesConcurrent或-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses:如果希望Full gc有更少的停機時間,可以啟用

-Xloggc:file :與-verbose:gc功能類似。隻是将每次GC事件的相關情況記錄到一個檔案中,檔案的位置最好是在本地,以避免

-Xprof:跟蹤正在運作的程式,并将跟蹤資料在标準輸出輸出;适合于開發環境調試

-Xrunhprof:HPEOF是J2SE自帶的一個記憶體使用分析工具profile agent。是一個動态連結庫檔案,監控CPU的使用率,Heap配置設定情況等。将這些資訊輸出到檔案或者socket。進而找到占用記憶體較大的對象。對與經常出現記憶體洩漏(OOM)的Java系統進行調優很有幫助。

-Xdebug:JVM調試參數,用于遠端調試。

二、分類

1.标準參數(-),所有的JVM實作都必須實作這些參數的功能,而且向後相容;

2.非标準參數(-X),預設JVM實作這些參數的功能,但是并不保證所有JVM實作都滿足,且不保證向後相容;

3.非Stable參數(-XX),此類參數各個JVM實作會有所不同,這些都是不穩定的并且不推薦在生産環境中使用。将來可能會随時取消,需要慎重使用。例如:-XX:PermSize=64m;-XX:MaxPermSize=512m。

tips:1)布爾型參數選項:-XX:+打開,-XX:-關閉。(比如-XX:+PrintGCDetails)

2)數字型參數選項通過-XX:=設定。數字可以是m/M(兆位元組),k/K(千位元組),g/G(G位元組)

比如32K表示32768位元組。(比如-XX:HeapDumpPath=./java_pid.hprof)

3)字元行參數選項通過-XX:=設定,通常用來指定一個檔案,路徑,或者一個指令清單。(比如-XX:+PrintGCDetails)

tips:verbose

-verbose:class

輸出jvm載入類的相關資訊,當jvm報告說找不到類或者類沖突時可此進行診斷。

-verbose:gc

輸出每次GC的相關情況。

-verbose:jni

輸出native方法調用的相關情況,一般用于診斷jni調用錯誤資訊。