JVM虛擬機---性能調優

1、調優策略

     對於GC的性能主要有2個方面的指標:吞吐量throughput(工做時間不算gc的時間佔總的時間比)和暫停pause(gc發生時app對外顯示的沒法響應)。java

一、調優的目的

  調優的最終目的固然增大吞吐量,減小暫停時間咯,映射到GC層面主要關心下面這兩點:程序員

      (1)將轉移到老年代的對象數量下降到最小。算法

      (2)減小full GC的執行時間。(儘可能減小GC的次數)併發

那什麼狀況對象會轉移到老年代,主要有這四種:app

    (1)新生代對象每經歷依次minor gc,年齡會加一,當達到年齡閥值會直接進入老年代。閥值大小通常爲15。工具

    (2)Survivor空間中年齡全部對象大小的總和大於survivor空間的一半,年齡大於或等於該年齡的對象就能夠直接進入老年代,而無需等到年齡閥值。性能

    (3)大對象直接進入老年代。優化

    (4)新生代複製算法須要一個survivor區進行輪換備份,若是出現大量對象在minor gc後仍然存活的狀況時,就須要老年代進行分配擔保,讓survivor沒法容納的對象直接進入老年代。網站

再來分析爲何說要減小full GC時間次數,那得先看GC的兩大分類spa

   Partial GC:並不收集整個GC堆的模式

                Young GC:只收集young gen的GC

                 Old GC:只收集old gen的GC。只有CMS的concurrent collection是這個模式

                Mixed GC:收集整個young gen以及部分old gen的GC。只有G1有這個模式

  Full GC:針對整個新生代、老生代、元空間(metaspace,java8以上版本取代perm gen)的全局範圍的GC。這裏就明白爲何要減小Full GC的次數了。

通常Full GC所花費的時間是Young GC的十倍。

二、哪些方面能夠考慮調優?

爲了達到上面的目的,通常地,你能夠考慮調優的有:

(1)減小使用全局變量和大對象。

(2)新生代和老年代的大小是否合適。

(3)新生代和老年代所佔的比例是否合適。

(4)倖存者區和新生區所佔的比例到是否合適。

(5)選擇合適的GC收集器。

三、什麼狀況說明GC已經不錯了呢?

此外,若是GC執行時間知足下列全部條件,就沒有必要進行GC優化了:

     Minor GC執行很是迅速(50ms之內)

     Minor GC沒有頻繁執行(大約10s執行一次)

     Full GC執行很是迅速(1s之內)

     Full GC沒有頻繁執行(大約10min執行一次)

括號中的數字並非絕對的,它們也隨着服務的狀態而變化。

 

2、調優經驗(規則)

這些規則,通常是你們比較建議的,能夠做爲初始配置的時候進行配置建議,固然具體的還得經過JVM工具監測來具體分析。

    (1) -Xmx 和-Xms 通常設置爲同樣大小。這樣能稍微提升GC的運行效率,由於他/她再也不須要估算堆是否須要調整大小了。

    (2)官方推薦新生代佔堆的3/8。

    (3)倖存代佔新生代的1/10。

    (4)垃圾收集器若是內存比較大建議G1收集器,固然也能夠用CMS收集器。

    (5)-XX:+DisableExplicitGC禁止System.gc(),省得程序員誤調用gc方法影響性能;

    (6)吞吐量優先的應用:通常吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代.緣由是,這樣能夠儘量回收掉大部分短時間對象,減小中期的對象,而年老代盡存放長期存活對象.

    (7)採用併發回收時,年輕代小一點,年老代要大,由於年老大用的是併發回收,即便時間長點也不會影響其餘程序繼續運行,網站不會停頓.

    (8)使用CMS的好處是用盡可能少的新生代, 而後老生代利用CMS並行收集, 這樣能保證系統低延遲的吞吐效率。

下面附上進行JVM的優化的一些參數:

複製代碼
-Xmx300m                        最大堆大小
-Xms300m                       初始堆大小
-Xmn100m                        年輕代大小
-XX:SurvivorRatio=8             Eden區與Survivor區的大小比值,設置爲8,則兩個Survivor區與一個Eden區的比值爲2:8,一個Survivor區佔整個年輕代的1/10

-XX:+UseG1GC                    使用 G1 (Garbage First) 垃圾收集器    
-XX:MaxTenuringThreshold=14        提高年老代的最大臨界值(tenuring threshold). 默認值爲 15[每次GC,增長1歲,到15歲若是還要存活,放入Old區]
-XX:ParallelGCThreads=8            設置垃圾收集器在並行階段使用的線程數[通常設置爲本機CPU線程數相等,即本機同時能夠處理的個數,設置過大也沒有用]
-XX:ConcGCThreads=8              併發垃圾收集器使用的線程數量


-XX:+DisableExplicitGC       禁止在啓動期間顯式調用System.gc()


-XX:+HeapDumpOnOutOfMemoryError   OOM時導出堆到文件
-XX:HeapDumpPath=d:/a.dump        導出OOM的路徑
-XX:+PrintGCDetails              打印GC詳細信息
-XX:+PrintGCTimeStamps            打印CG發生的時間戳
-XX:+PrintHeapAtGC               每一次GC前和GC後,都打印堆信息
-XX:+TraceClassLoading            監控類的加載
-XX:+PrintClassHistogram          按下Ctrl+Break後,打印類的信息
複製代碼
相關文章
相關標籤/搜索