背景
今天在線上灰度部署服務(wù)的時候病涨,容器循環(huán)重啟。沒法排查啟動失敗原因疙描。(同樣配置诚隙、代碼在沙箱沒問題)
經(jīng)云平臺同事告知后開啟容器debug模式,debug模式下起胰,容器不會重啟久又。
重新部署后,登上機器查看jdk啟動日志效五,報下列錯誤
Java HotSpot(TM) 64-Bit Server VM warning: Can't have more ConcGCThreads (8) than ParallelGCThreads (4).
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
排查原因
我們知道ConcGCThreads是g1的并發(fā)標記線程數(shù)配置地消。通過啟動報錯知道,不能比ParallelGCThreads設(shè)置更多的ConcGCThreads線程畏妖。
查看服務(wù)器配置
-Xms4g -Xmx4g -Xss1024K -XX:SurvivorRatio=65536 -XX:MetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ConcGCThreads=8 -XX:G1HeapRegionSize=16m -Dfastjson.parser.safeMode=true
沒有配置ParallelGCThreads脉执,那么ParallelGCThreads走默認的配置,如果cpu小于8戒劫,則使用cpu核數(shù)半夷,和報錯一樣婆廊,我的cpu核數(shù)是4
默認情況下,G1垃圾收集器會將ConcGCThreads這個線程總數(shù)設(shè)置為并行垃圾線程數(shù)(-XX:ParallelGCThreads)的四分之一
設(shè)置的是8玻熙,遠高于默認值否彩。
懷疑
懷疑是使用的jvm版本做了限制。因為上線時間較趕嗦随,依賴于qa時間列荔,我又沒上線權(quán)限,沒法一一驗證枚尼,于是直接替換cms解決贴浙。
比較好奇的是,回滾到原版本署恍,一樣的配置就沒有問題崎溃。。
解決方法
替換為CMS
-Xms4g -Xmx4g -Xmn1g -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+CMSPermGenSweepingEnabled -XX:SurvivorRatio=8 -XX:MaxDirectMemorySize=2g -XX:-OmitStackTraceInFastThrow -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80 -Dfastjson.parser.safeMode=true
git commitlog
G1啟動報錯導(dǎo)致線上部署失敗Can't have more ConcGCThreads (8) than ParallelGCThreads (4).
應(yīng)用只用到4g盯质,且該機器只4核袁串,不太適合G1
其實我們設(shè)置下兩個參數(shù)符合規(guī)則就行,但是我這個機器就4g呼巷,算了吧