堆參數算法
回收器參數性能優化
如上表所示,目前主要有串行、並行和併發三種,對於大內存的應用而言,串行的性能過低,所以使用到的主要是並行和併發兩種。並行和併發 GC 的策略經過 UseParallelGC 和 UseConcMarkSweepGC 來指定,還有一些細節的配置參數用來配置策略的執行方式。例如:XX:ParallelGCThreads, XX:CMSInitiatingOccupancyFraction 等。 一般:Young 區對象回收只可選擇並行(耗時間),Old 區選擇併發(耗 CPU)。服務器
項目中經常使用配置markdown
經常使用組合併發
GC 調優原則post
在調優以前,咱們須要記住下面的原則:性能
多數的 Java 應用不須要在服務器上進行 GC 優化;優化
多數致使 GC 問題的 Java 應用,都不是由於咱們參數設置錯誤,而是代碼問題;spa
在應用上線以前,先考慮將機器的 JVM 參數設置到最優(最適合);3d
減小建立對象的數量;
減小使用全局變量和大對象;
GC 優化是到最後不得已才採用的手段;
在實際使用中,分析 GC 狀況優化代碼比優化 GC 參數要多得多。
GC 調優目的
將轉移到老年代的對象數量下降到最小;
減小 GC 的執行時間。
策略 1:將新對象預留在新生代,因爲 Full GC 的成本遠高於 Minor GC,所以儘量將對象分配在新生代是明智的作法,實際項目中根據 GC 日誌分析新生代空間大小分配是否合理,適當經過「-Xmn」命令調節新生代大小,最大限度下降新對象直接進入老年代的狀況。
策略 2:大對象進入老年代,雖然大部分狀況下,將對象分配在新生代是合理的。可是對於大對象這種作法卻值得商榷,大對象若是首次在新生代分配可能會出現空間不足致使不少年齡不夠的小對象被分配的老年代,破壞新生代的對象結構,可能會出現頻繁的 full gc。所以,對於大對象,能夠設置直接進入老年代(固然短命的大對象對於垃圾回收老說簡直就是噩夢)。-XX:PretenureSizeThreshold 能夠設置直接進入老年代的對象大小。
策略 3:合理設置進入老年代對象的年齡,-XX:MaxTenuringThreshold 設置對象進入老年代的年齡大小,減小老年代的內存佔用,下降 full gc 發生的頻率。
策略 4:設置穩定的堆大小,堆大小設置有兩個參數:-Xms 初始化堆大小,-Xmx 最大堆大小。
策略5:注意: 若是知足下面的指標,則通常不須要進行 GC 優化:
MinorGC 執行時間不到50ms;
Minor GC 執行不頻繁,約10秒一次;
Full GC 執行時間不到1s;
Full GC 執行頻率不算頻繁,不低於10分鐘1次。
後續會持續更新性能優化專題知識,寫的很差的地方也但願大牛能指點一下,你們以爲不錯能夠點個贊在關注下,之後還會分享更多文章!