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後,打印類的信息