JVM系列篇:JVM性能調優的6大步驟,及關鍵調優參數詳解

本系列會持續更新

1、JVM內存調優

 

對JVM內存的系統級的調優主要的目的是減小GC的頻率和Full GC的次數。程序員

1.Full GC面試

會對整個堆進行整理,包括Young、Tenured和Perm。Full GC由於須要對整個堆進行回收,因此比較慢,所以應該儘量減小Full GC的次數。算法

2.致使Full GC的緣由數組

1)年老代(Tenured)被寫滿緩存

調優時儘可能讓對象在新生代GC時被回收、讓對象在新生代多存活一段時間和不要建立過大的對象及數組避免直接在舊生代建立對象 。服務器

2)持久代Pemanet Generation空間不足架構

增大Perm Gen空間,避免太多靜態對象 , 控制好新生代和舊生代的比例工具

3)System.gc()被顯示調用性能

垃圾回收不要手動觸發,儘可能依靠JVM自身的機制優化

在對JVM調優的過程當中,很大一部分工做就是對於FullGC的調節,下面詳細介紹對應JVM調優的方法和步驟。

2、JVM性能調優方法和步驟

 

1.監控GC的狀態

使用各類JVM工具,查看當前日誌,分析當前JVM參數設置,而且分析當前堆內存快照和gc日誌,根據實際的各區域內存劃分和GC執行時間,以爲是否進行優化。

舉一個例子: 系統崩潰前的一些現象:

  • 每次垃圾回收的時間愈來愈長,由以前的10ms延長到50ms左右,FullGC的時間也有以前的0.5s延長到四、5s
  • FullGC的次數愈來愈多,最頻繁時隔不到1分鐘就進行一次FullGC
  • 年老代的內存愈來愈大而且每次FullGC後年老代沒有內存被釋放

以後系統會沒法響應新的請求,逐漸到達OutOfMemoryError的臨界值,這個時候就須要分析JVM內存快照dump。

2.生成堆的dump文件

經過JMX的MBean生成當前的Heap信息,大小爲一個3G(整個堆的大小)的hprof文件,若是沒有啓動JMX能夠經過Java的jmap命令來生成該文件。

3.分析dump文件

打開這個3G的堆信息文件,顯然通常的Window系統沒有這麼大的內存,必須藉助高配置的Linux,幾種工具打開該文件:

  • Visual VM
  • IBM HeapAnalyzer
  • JDK 自帶的Hprof工具
  • Mat(Eclipse專門的靜態內存分析工具)推薦使用

備註:文件太大,建議使用Eclipse專門的靜態內存分析工具Mat打開分析。

4.分析結果,判斷是否須要優化

若是各項參數設置合理,系統沒有超時日誌出現,GC頻率不高,GC耗時不高,那麼沒有必要進行GC優化,若是GC時間超過1-3秒,或者頻繁GC,則必須優化。

注:若是知足下面的指標,則通常不須要進行GC:

  • Minor GC執行時間不到50ms;
  • Minor GC執行不頻繁,約10秒一次;
  • Full GC執行時間不到1s;
  • Full GC執行頻率不算頻繁,不低於10分鐘1次;

5.調整GC類型和內存分配

若是內存分配過大或太小,或者採用的GC收集器比較慢,則應該優先調整這些參數,而且先找1臺或幾臺機器進行beta,而後比較優化過的機器和沒有優化的機器的性能對比,並有針對性的作出最後選擇。

6.不斷的分析和調整

經過不斷的試驗和試錯,分析並找到最合適的參數,若是找到了最合適的參數,則將這些參數應用到全部服務器。


cms參數優化步流程

下面我再繼續介紹下JVM的關鍵參數配置(僅用於參考)。

JVM調優參數參考

1.針對JVM堆的設置,通常能夠經過-Xms -Xmx限定其最小、最大值,爲了防止垃圾收集器在最小、最大之間收縮堆而產生額外的時間,一般把最大、最小設置爲相同的值;

2.年輕代和年老代將根據默認的比例(1:2)分配堆內存, 能夠經過調整兩者之間的比率NewRadio來調整兩者之間的大小,也能夠針對回收代。

好比年輕代,經過 -XX:newSize -XX:MaxNewSize來設置其絕對大小。一樣,爲了防止年輕代的堆收縮,咱們一般會把-XX:newSize -XX:MaxNewSize設置爲一樣大小。

3.年輕代和年老代設置多大才算合理

1)更大的年輕代必然致使更小的年老代,大的年輕代會延長普通GC的週期,但會增長每次GC的時間;小的年老代會致使更頻繁的Full GC

2)更小的年輕代必然致使更大年老代,小的年輕代會致使普通GC很頻繁,但每次的GC時間會更短;大的年老代會減小Full GC的頻率

如何選擇應該依賴應用程序對象生命週期的分佈狀況: 若是應用存在大量的臨時對象,應該選擇更大的年輕代;若是存在相對較多的持久對象,年老代應該適當增大。但不少應用都沒有這樣明顯的特性。

在抉擇時應該根 據如下兩點:

(1)本着Full GC儘可能少的原則,讓年老代儘可能緩存經常使用對象,JVM的默認比例1:2也是這個道理 。

(2)經過觀察應用一段時間,看其餘在峯值時年老代會佔多少內存,在不影響Full GC的前提下,根據實際狀況加大年輕代,好比能夠把比例控制在1:1。但應該給年老代至少預留1/3的增加空間。

4.在配置較好的機器上(好比多核、大內存),能夠爲年老代選擇並行收集算法: -XX:+UseParallelOldGC 

5.線程堆棧的設置:每一個線程默認會開啓1M的堆棧,用於存放棧幀、調用參數、局部變量等,對大多數應用而言這個默認值太了,通常256K就足用。

理論上,在內存不變的狀況下,減小每一個線程的堆棧,能夠產生更多的線程,但這實際上還受限於操做系統。

以爲不錯請點贊支持下。

----end----

如下是JVM系列文章集合,感興趣不妨深刻了解,擴充知識棧:

JVM的4種垃圾回收算法、垃圾回收機制與總結
7種JVM垃圾收集器特色,優劣勢、及使用場景
深刻詳解JVM內存模型與JVM參數詳細配置
JVM性能調優的6大步驟,及關鍵調優參數詳解

深刻剖析G1收集器+回收流程+推薦用例 

做者Mike,10年+程序員。主要分享:BAT 面試、Java 架構、招聘資訊等內容。

曾前後就任於淘寶、盛大、百度、攜程 ,歷任高級研發工程師、研發經理、架構師、事業部 CTO。

堅持寫文2年多,原創內容400篇,目前粉絲總數7萬+,歡迎留言或進個人我的羣179961551交流技術、分享面試機會,拒絕廣告,我也會在羣內不按期交流、探討~

相關文章
相關標籤/搜索