EDAS 配置 CoreDump 和 GC
淺談:
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 機制一樣。