作者:張醫博
淺談:
EDAS 創建應用時 ,支持客戶自己自定義生成 coredump 和 GC 的策略,由於 EDAS 使用 JVM 本身就是開源的 Java 容器,所以支持的參數和配置方法也都是一致,只布偶封裝在 EDAS 控制檯下發而已。
coredump 配置
- ecs 是否產生 coredump 文件要看系統本身是否開啟了 coredump 開關。 ulimit -c 命令可以設置是否開啟。
- 可以通過 ulimit -c ulimited 命令設置 coredump 無限大。
JVM crash
JVM. crash 掉會生產 2 個文件,第一個是 JVM 的 coredump 文件,第二個是 hfs_error 的應用錯誤日誌,如圖:
應用 OOM
EDAS 支持自定義 OOM 日誌的路徑。
配置 GC
tomcat 中的 GC 配置和開源的配置是一樣的,沒有差別,先來了解一下 GC. 的概念。
垃圾收集器
在java虛擬機中,垃圾回收器不僅僅只有一種,什麼情況下該使用哪種,對性能又有什麼影響,這些都是我們需要了解的。
串行垃圾收集器
串行回收器是指使用單線程進行垃圾回收的回收器。每次回收時,串行回收器只有一個工作線程,對於並行能力較弱的計算機來說,串行回收器的專注性和獨佔性往往有更好的性能表現。串行回收器可以在新生代和老年代使用。根據作用於不同的對空間分為新生代串行回收器和老年代串行回收器。
-XX:+UseSerialGC參數可以設置使用新生代串行回收器和老年代串行回收器。
並行垃圾收集器
並行的垃圾回收器在串行回收器的基礎上做了改進,他可以使用多個線程同時進行垃圾回收,對於計算能力強的計算機而言,可以有效的縮短垃圾回收所需的實際時間。
ParNew回收器
是一個工作在新生代的垃圾回收器,他只是簡單的將串行回收器多線程化,它的回收策略和算法和串行回收器一樣。
使用-XX:+UseParNewGC 新生代使用ParNew回收器,老年代則使用串行回收器。
ParNew回收器工作時的線程數量可以使用-XX:ParallelGCThreads參數指定,一般最好和計算機的CPU相當,避免過多的線程影響性能。
新生代ParallelGC回收器,使用了複製算法的回收器,也是多線程獨佔形式的回收器,但ParallelGC回收器有一個很重要的特點,就是它非常關注吞吐量。
提供了兩個參數控制系統的吞吐量
-XX: MaxGCPauseMillis:設置最大垃圾收集停頓時間,可用於把虛擬機在GC停頓的時間控制在MaxGCPauseMillis範圍內,如果希望減少GC停頓時間可以將MaxGCPauseMillis設置的很小,但是會導致GC頻繁,從而增加GC的總時間,降低了吞吐量。所以要根據實際情況設置該值。
-XX: GCTimeRatio:設置吞吐量的大小,它是一個0到100之間的整數,默認情況下它的取值是99,那麼系統將花費不超過1/(1+n)的時間用於垃圾回收,也就是1/(1+99)=1%的時間。
另外還可以指定-XX:+UseAdaptiveSizePolicy打開自適應模式,在這種模式下,新生代的大小、eden、from/to的比例,以及晉升老年代的對象的年齡參數將被自動調整,以達到在堆大小、吞吐量和停頓時間之間的平衡點。
老年代ParallelOldGC回收器
也是一種多線程的回收器,和新生代的ParallelGC回收器一樣,也是一種關注吞吐量的回收器,它使用標記壓縮算法實現。
-XX:+UseParallelOldGC進行設置
-XX:+ParallelGCThreads也可以設置垃圾收集時的線程數量。
CMS回收器
CMS全稱為:Current Mark Sweep意為併發標記清除,他使用的是標記清除法,主要關注系統的停頓時間。
使用-XX:+UseConcMarkSweepGC進行設置
使用-XX:+ConcGCThreads設置併發線程數量
CMS並不是獨佔的回收器,也就是說CMS回收的過程中,應用程序仍在不斷的運行,又會有新的垃圾不斷的產生,所以在使用CMS的過程中應該確保應用程序的內存足夠用。CMS不會等到應用程序飽和的時候才去回收垃圾,而是在某一閾值的時候開始回收,回收閾值可以用指定的參數進行配置,-XX:CMSInitiatingOccupancyFraction來指定,默認值為68,也就是說當老年代的空間使用率達到68%的時候,會執行CMS回收。如果內存使用率增長很快,在CMS執行的過程中,已經出現內存不足的情況,此時CMS回收就會失敗,虛擬機將啟動老年代串行回收器進行垃圾回收,這會使應用程序中斷,直到垃圾回收完成後才會正常工作。這個過程GC停頓的時間可能比較長,所以-XX:CMSInitiatingOccupancyFraction的設置要根據實際情況。
G1回收器
G1回收器(Garbage-First)是在jdk1.7中提出的垃圾回收器,從長期目標來看是為了取代CMS回收器,G1回收器擁有獨特的垃圾回收策略,G1屬於分代垃圾回收器,區分新生代和老年代,依然有eden和from/to區,並不要求整個eden區或新生代、老年代空間都連續,它使用的是分區算法。
並行性: G1回收期間可多線程同時工作。
併發性: G1擁有與應用程序交替執行的能力,部分工作可與應用程序同時執行,在整個GC期間不會完全阻塞應用程序。
分代GC: G1依然是一個分代收集器,但是它是兼顧新生代和老年代一起工作的,之前的垃圾收集器或者在新生代工作或者在老年代工作,因此這是一個很大的不同。
空間整理: G1在回收過程中,不會像CMS那樣在若干次GC後進行碎片整理,G1採用有效複製對象的方式減少空間碎片。
可預見性:由於分區的原因,G1可以只選取部分區域進行回收,縮小了回收的範圍,提高了性能。
使用-XX:+UseG1GC應用G1收集器
使用-XX:MaxGCPauseMillis指定最大的停頓時間
使用-XX:ParallelGCThreads設置並行回收的線程數量
EDAS GC 配置
EDAS 支持四種 GC 模式,每一種配置的輔助參數可開源的 GC 機制一樣。