GC 指令

查看Java8默認GC策略

  1. java -XX:+PrintCommandLineFlags -versionjava

  2. jinfo -flags PID 查看 「Non-default VM flags:」 中的信息
    算法

發現:
默認下是 -XX:+UseParallelGC : 新生代併發收集,老年代串行收集。多線程

指令

新生代(別名) 老年代 JVM 參數
Serial (DefNew) Serial Old(PSOldGen) -XX:+UseSerialGC
Parallel Scavenge (PSYoungGen) Serial Old(PSOldGen) -XX:+UseParallelGC
Parallel Scavenge (PSYoungGen) Parallel Old (ParOldGen) -XX:+UseParallelOldGC
ParNew (ParNew) Serial Old(PSOldGen) -XX:-UseParNewGC
ParNew (ParNew) CMS(PSOldGen) -XX:+UseConcMarkSweepGC
G1 G1 -XX:+UseG1GC

典型配置

  •  -XX:+UseSerialGC: 
    新生代,老年代都使用串行回收收集器。新生代使用複製算法,老年代使用標記-整理算法。使用一個線程進行GC,串行,其它工做線程暫停。
    Jvm運行在Client模式下的默認值,使用Serial + Serial Old的收集器組合進行內存回收
  • -XX:+UseParNewGC:  
    新生代進行並行回收,老年代仍舊使用串行回收。默認關閉。Serial收集器的多線程版,用多個線程進行並行GC,其它工做線程暫停。(操做系統是多核CPU上效果明顯,單核CPU建議使用串行回收器。)打印GC詳情時ParNew標識着使用了ParNewGC回收器。
    [GC[ParNew: 78656K->8703K(78656K), 0.0180555 secs] 81048K->17429K(253440K), 0.0187828 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
  • -XX:+UseParallelGC
    吞吐量優先的併發垃圾回收器,做用在新生代,使用複製算法。 關注CPU吞吐量,即運行用戶代碼的時間 /(運行用戶代碼時間+垃圾收集時間)。
    Jvm運行在Server模式下的默認值,使用Parallel Scavenge +  Serial Old的收集器組合進行回收
  • -XX:+UseParallelOldGC: 
    使用Parallel Scavenge +  Parallel Old的收集器組合進行回收 ,默認是使用單線程。打印出的GC會帶PSYoungGen、ParOldGen關鍵字。
    [Full GC [PSYoungGen: 4032K->0K(145920K)] [ParOldGen: 164500K->138362K(246272K)] 168532K->138362K(392192K) [PSPermGen: 67896K->67879K(136192K)], 1.006
    • -XX:ParallelGCThreads=<N>:
      設置併發垃圾回收的線程數。可設置與機器處理器數量相等。 該參數jvm會默認設置成online的cpu的核數但並不包括被shutdown的cpu的核數
    • -XX:MaxGCPauseMillis=<N>: 
      指定垃圾回收時的最長暫停時間,它的參數運行值是一個大於0的毫秒數。收集器將盡力保證垃圾回收時間不超過設定值,系統運行的須要回收的垃圾總量是固定的,縮短停頓時間的同時會增大回收頻度。
    • -XX:GCTimeRatio=<N>: 
      吞吐量爲垃圾回收時間與非垃圾回收時間的比值,它運行的參數值是0-100的整數。公式爲1/(1+N)。eg: -XX:GCTimeRatio=19時,表示5%(1/(1+19))的時間用於垃圾回收。默認狀況爲99,即1%的時間用於垃圾回收。
    • -XX:UseAdaptiveSizePolicy: 
      自適應的調節策略。JVM會根據實際運行狀況動態調整新生代大小、新生代和s區比例、晉升老年代對象大小等細節參數。
      (JDK 1.8 默認使用 UseParallelGC 垃圾回收器,該垃圾回收器默認啓用該配置。由 AdaptiveSizePolicy 引起的 GC 問題
  • -Xms:
    表示java虛擬機堆區內存初始內存分配的大小。
  • -Xmx:
    表示java虛擬機堆區內存可被分配的最大上限 (開發過程當中,一般會將-Xms 與-Xmx兩個參數的配置相同的值,其目的是爲了可以在java垃圾回收機制清理完堆區後不須要從新分隔計算堆區的大小而浪費資源
  • -XX:newSize:
    表示新生代初始內存的大小,應該小於-Xms的值;
  • -XX:MaxNewSize:
    表示新生代可被分配的內存的最大上限;固然這個值應該小於-Xmx的值;
  • -Xmn:
    這個參數則是對 -XX:newSize、-XX:MaxnewSize兩個參數的同時配置,
    也就是說: 若是經過-Xmn來配置新生代的內存大小,那麼-XX:newSize = -XX:MaxnewSize = -Xmn,雖然會很方便,但須要注意的是這個參數是在JDK1.4版本之後才使用的。
  • -Xss:
    爲jvm啓動的每一個線程分配的內存大小,
  • -XX:MetaspaceSize:
    class metadata的初始空間配額,以bytes爲單位,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:若是釋放了大量的空間,就適當的下降該值;若是釋放了不多的空間,那麼在不超過MaxMetaspaceSize(若是設置了的話),適當的提升該值。
  • -XX:MaxMetaspaceSize:
    能夠爲class metadata分配的最大空間。默認是沒有限制的。
  • -XX:MinMetaspaceFreeRatio:
    在GC以後,最小的Metaspace剩餘空間容量的百分比,減小爲class metadata分配空間致使的垃圾收集
  • -XX:MaxMetaspaceFreeRatio:
    在GC以後,最大的Metaspace剩餘空間容量的百分比,減小爲class metadata釋放空間致使的垃圾收集
  • -XX:+PrintTenuringDistribution: 
    用於顯示每次Minor GC時Survivor區中各個年齡段的對象的大小
  • -XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold: 
    用於設置晉升到老年代的對象年齡的最小值和最大值,每一個對象在堅持過一次Minor GC以後,年齡就加1。
  • -XX:PreternureSizeThreshold
    直接晉升老年代的對象大小,設置了這個參數後,大於這個參數的對象直接在老年代進行分配
  • -XX:+HandlePromotionFailure :
    是否容許新生代收集擔保,進行一次minor gc後, 另外一塊Survivor空間不足時,將直接會在老年代中保留。
  • -XX:+DisableExplicitGC :
    關閉手動System.gc()
  • -XX:+UseFastaccessorMethods :
    原始類型優化併發

垃圾回收統計信息

  • -XX:+PrintGC
    [GC 118250K->113543K(130112K), 0.0094143 secs] 
    [Full GC 121376K->10414K(130112K), 0.0650971 secs]
  • -XX:+PrintGCDetails
    [GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
    [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
  • -XX:+PrintGCTimeStamps 與上兩命令合用
    11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
  • -XX:+PrintGCApplicationConcurrentTime 打印每次垃圾回收前,程序未中斷的執行時間。可與上面混合使用
    Application time: 0.5291524 seconds
  • -XX:+PrintGCApplicationStoppedTime 打印垃圾回收期間程序暫停的時間。可與上面混合使用app

    Total time for which application threads were stopped: 0.0468229 seconds
  • -XX:PrintHeapAtGC 打印GC先後的詳細堆棧信息jvm

    34.702: [GC {Heap before gc invocations=7:
    def new generation   total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
    eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
    from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000)
    to   space 6144K,   0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
    ...
  • -Xloggc:filename  指定log輸出文件性能

eg優化

java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-Xmx3550m:設置JVM最大可用內存爲3550M。spa

-Xms3550m:設置JVM初始內存爲3550m。此值能夠設置與-Xmx相同,以免每次垃圾回收完成後JVM從新分配內存操作系統

-Xmn2g:設置年輕代大小爲2G。整個堆大小= 年輕代大小 + 年老代大小 + 持久代大小。持久代通常固定大小爲64m,因此增大年輕代後,將會減少年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。

-Xss128k:設置每一個線程的堆棧大小。JDK5.0之後每一個線程堆棧大小爲1M,之前每一個線程堆棧大小爲256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。

-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區進行屢次複製,這樣能夠增長對象再年輕代的存活時間,增長在年輕代即被回收的概論。

相關文章
相關標籤/搜索