JVM 性能調優淺談
1. 寫給愛學習的小夥伴們
因爲 JVM 調優之坑巨大同時爲了避免誤人子弟,我也就在網上查閱資料簡單總結了下相關知識,若是有感興趣的同窗能夠參考本文和以前的文章來自行學習。
(請參考以前的總結來了解學習,由於我都快忘記了!)
複製代碼
2. JVM 調優概述
2.1 性能定義
1、吞吐量:
指不考慮 GC 引發的停頓時間和內存消耗,垃圾收集器能支撐應用達到的最高性能指標。
2、延遲:
延遲的度量標準是縮短因爲垃圾收集器引發的時間停頓或者徹底消除由於垃圾收集所引發的停頓,避免應用運行時發生抖動。
3、內存佔用:
垃圾收集器流暢運行所須要的內存數量。
複製代碼
2.2 調優原則
GC 優化的兩個目標:
1、將進入老年代的對象數量降到最低。
2、減小 Full GC 的執行時間。
GC 優化的基本原則是:
將不一樣的 GC 參數應用到兩個及以上的服務器上而後比較他們的性能,以後將那些被證實能夠提升性能或減小 GC 執行時間的參數應用於最終的工做服務器上。
複製代碼
2.2.1 將進入老年代的對象數量降到最低
除了能夠在 JDK 1.7 及更高版本中使用的 G1 收集器之外,其餘分代 GC 都是由 Oracle JVM 提供的。關於分代 GC,就是說對象在 Eden 區被建立,而後被轉移到 Survivor 區,在此以後剩餘的對象會被轉入到老年代。也有一些對象因爲佔用內存過大,在 Eden 區被建立後會直接後被傳入老年代。老年代 GC 相對來講會比新生代 GC 更耗時,所以減小進入老年代的對象數量能夠顯著下降 Full GC 的頻率。咱們可能會覺得減小進入老年代的對象數量意味着把他們留在新生代,事實上正好相反,在新生代內存的大小是能夠調節的。
複製代碼
2.2.2 下降 Full GC 的時間
Full GC 的執行時間比 Minor GC 要長不少,所以若是在 Full GC 上花費的時間過多(超過 1s),就極可能會出現超時錯誤。
a.若是經過減少老年代內存來減小 Full GC 時間,可能會引發 OutOfMemoryError 或者致使 Full GC 的頻率升高。
b.若是經過增長老年代內存來下降 Full GC 的頻率,Full GC 的時間可能所以增長。
所以,咱們須要把老年代的大小設置成一個"合適"的值。
下面是 GC 優化須要考慮的 JVM 參數。
複製代碼
類型 |
參數 |
描述 |
堆內存大小 |
-Xms |
啓動 JVM 時堆內存的大小 |
|
-Xmx |
堆內存最大限制 |
新生代空間大小 |
-XX:NewRatio |
新生代和老年代的內存比 |
|
-XX:NewSize |
新生代內大小 |
|
-XX:SurvivorRatio |
Eden 區和 Survivor 區的內存比 |
GC 優化時最經常使用的參數是 -Xms,-Xmx 和 -XX:NewRatio。
-Xms 和 -Xmx 參數一般是必須的,因此 NewRatio 的值將對 GC 性能產生重要的影響。
有些人可能會問如何設置永久代內存大小,咱們能夠用 -XX:PermSize 和 -XX:MaxPermSize 參數來進行設置,可是咱們要記住,只有當出現 OutOfMemoryError 錯誤時咱們才須要去設置永久代內存。
複製代碼
2.3 GC 優化的過程
GC 的優化過程和大多數咱們常見的提高性能的過程類似,下面是查閱資料整理的流程。
複製代碼
2.3.1 監控 GC 的狀態
咱們須要監控 GC 從而檢查系統中運行的 GC 各類狀態。
複製代碼
2.3.2 分析監控結果後來決定是否須要優化 GC
在檢查 GC 狀態後,咱們須要分析監控結構並決定是否須要進行 GC 優化。若是分析結果顯示運行 GC 的時間只有 0.1 ~ 0.3 秒,那麼就不須要把時間浪費在 GC 優化上,但若是運行 GC 的時間達到 1 ~ 3 秒,甚至大於 10 秒,那麼 GC 優化就是頗有必要的。
可是咱們若是已經分配了大約 10GB 內存給 Java,而且這些內存都是沒法省下的,那麼久沒法進行 GC 優化了。在進行 GC 優化以前,咱們須要考慮爲何分配那麼大的內存空間,若是咱們分配了 1GB 或者 2GB 大小的內存空間而且出現了 OutOfMemoryError,那咱們就應該執行 **堆快照(heap dump)**來消除致使異常的緣由。
注意:
a.**堆快照(heap dump)**是一個用來檢查 Java 內存中的對象和數據的內存文件。該文件能夠經過執行 JDK 中的 jmap 命令來建立。在建立文件的過程當中,全部 Java 程序都將暫停,所以,不要在系統執行過程當中建立該文件。
你們能夠從網上搜索關於 heap dump 的詳細說明,這裏就不細說了。
複製代碼
2.3.3 設置 GC 類型/內存大小
若是咱們決定要進行 GC 優化,那麼咱們須要選擇一個 GC 類型而且爲它設置內存大小。此時若是咱們有多個服務器,那麼就如上文提到的那樣,在每臺機器上設置不一樣的 GC 參數並分析他們的區別。
複製代碼
2.3.4 分析結果
在設置完 GC 參數後就能夠開始收集數據,請在收集至少 24 小時候在進行結果分析。若是咱們足夠幸運,咱們可能會找到系統的最佳 GC 參數。如若否則,咱們還須要分析輸出日誌並檢查分配的內存,而後須要經過不斷的調整 GC 類型/內存大小來找到系統最佳的參數。
複製代碼
2.3.5 結束 GC 優化
若是 GC 優化的結果使人滿意,就能夠將參數應用到全部的服務器上,而且中止 GC 優化。
複製代碼