一、VM 內存的系統級調優。
首先注意在對 JVM 內存調優的時候不能只看操作系統級別 java 進程所占用的內存,這個數值不能準確的反應堆內存的真實占用情況,因為 GC 過后這個值是不會變化的,因此內存調優的時候要更多地使用 JDK 提供的內存查看工具,比如 JConsole 和 java VisualVM。
對 JVM 內存的系統級的調優主要目的是減少 GC 的頻率和 Full GC 的次數,過多的 GC 和 Full GC 是會占用很多的系統資源(主要是 CPU),影響系統的吞吐量。特別要關注 Full GC,因為它會對整個堆進行整理,Full GC 一般由以下幾個原因導致:
1、老年代空間不足。
調優時盡量讓對象在新生代 GC 時被回收、讓對象在新生代多存活一段時間和不要創建過大的對象及數組避免直接在老年代創建對象。
2、持久代;空間不足。
增大持久代空間,避免太多靜態對象。
3、System.gc () 被顯示調用。
垃圾回收不要手動觸發,盡量依靠 JVM 自身的機制。
二、調優手段
調優手段主要是通過控制堆內存的各個部分的比例和 GC 策略來實現,下面來看看各部分比例不良設置會導致什么后果:
1、新生代設置過小。
- 新生代 GC 次數非常頻繁,增大系統消耗。
- 導致大對象直接進入老年代,占據了老年代剩余空間,誘發 Full GC。
2、新生代設置過大。
- 新生代設置過大會導致老年代過小,從而誘發 Full GC。
- 新生代 GC 耗時大幅度增加。
一般來說新生代占整個堆 1/3 比較合適。
3、保留空間 Survivor 設置過小。
導致對象從使用空間 eden 直接到達老年代,降低了在新生代的存活時間。
4、保留空間 Survivor 設置過大。
導致 eden 過小,增加了 GC 頻率。
另外,通過 - XX:MaxTenuringThreshold=n 來控制新生代存活時間,盡量讓對象在新生代被回收。
JVM 提供兩種較為簡單的 GC 策略的設置方式。
(1)吞吐量優先。
JVM 以吞吐量為指標,自行選擇相應的 GC 策略及控制新生代與老年代的大小比例,來達到吞吐量指標。這個值可由 - XX:GCTimeRatio=n 來設置。
(2)暫停時間優先。
JVM 以暫停時間為指標,自行選擇相應的 GC 策略及控制新生代和老年代的大小比例,盡量保證每次 GC 造成的應用停止時間都在指定的數值范圍內完成,這個值可由 - XX:MaxGCPauseRatio=n 來設置。
三、JVM 參數設置、分析。
不管是 YGC 還是 Full GC,GC 過程中都會對導致程序運行中中斷,正確的選擇HotSpot VM GC 的種類,調整 JVM、GC 的參數,可以極大的減少由于 GC 工作,而導致的程序運行中斷方面的問題,進而適當的提高 Java 程序的工作效率。但是調整 GC 是一個極為復雜的過程,由于各個程序具備不同的特點,如:web 和 GUI 程序就有很大區別(Web 可以適當的停頓,但 GUI 停頓是客戶無法接受的),而且由于跑在各個機器上的配置不同(主要 cup 個數,內存不同),所以使用的 GC 種類也會不同 (如何選擇見HotSpot VM GC 的種類)。本文將注重介紹 JVM、GC 的一些重要參數的設置來提高系統的性能。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.