作者:張醫博
淺談:
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 機制一樣。