依賴包濫用System.gc()導(dǎo)致的Full GC

依賴包濫用System.gc()導(dǎo)致的頻繁Full GC

簡書 滌生铃辖。
轉(zhuǎn)載請注明原創(chuàng)出處厦瓢,謝謝凉馆!
如果讀完覺得有收獲的話蝶锋,歡迎點(diǎn)贊加關(guān)注涨享。

介紹

業(yè)務(wù)部門的一個(gè)同事遇到個(gè)奇怪的Full GC問題吟秩,有個(gè)服務(wù)遷移到新的應(yīng)用后,一直頻繁Full GC。新應(yīng)用機(jī)器的配置是4c 8g企量,老應(yīng)用是4c 4g测萎,老應(yīng)用GC都很正常,并且代碼沒有變更梁钾,所以比較奇怪绳泉。

現(xiàn)象

問題的現(xiàn)象是逊抡,從監(jiān)控圖上看一直有大量的Full GC
GC 監(jiān)控圖

排查

遇到這個(gè)問題姆泻,一般都是先看看各個(gè)區(qū)的內(nèi)存占用情況:
old young gen監(jiān)控圖

perm gen監(jiān)控圖

從監(jiān)控圖上看Old Gen、Young Gen冒嫡、Perm Gen拇勃,沒什么問題,不會觸發(fā)Full GC孝凌,當(dāng)然這里看各個(gè)Gen是否會觸發(fā)Full GC需要結(jié)合JVM參數(shù)配置來看方咆。

順便也看了下GC日志,一直狂暴CMS GC日志蟀架,而且可以看到老年代使用空間也不大瓣赂,細(xì)心可以發(fā)現(xiàn)片拍,大量的CMS GC中夾雜著Young煌集、Perm區(qū)的回收,所以其實(shí)是Full GC捌省。GC日志如下:
GC日志

老應(yīng)用的jvm參數(shù)配置
老應(yīng)用的jvm參數(shù)配置

新應(yīng)用的jvm參數(shù)配置
新應(yīng)用的jvm參數(shù)配置

通過上面的觀察苫纤,再根據(jù)一般觸發(fā)CMS GC幾個(gè)可能性:

  • Old Gen使用達(dá)到一定的比率,默認(rèn)為92%纲缓,這里看CMSInitiatingOccupancyFraction=80%卷拘,而實(shí)際才使用2%(看監(jiān)控圖表)不到,所以排除這種情況祝高。
  • 配置了CMSClassUnloadingEnabled栗弟,且Perm Gen的使用達(dá)到一定的比率默認(rèn)為92%,這里看CMSInitiatingPermOccupancyFraction=80%工闺,而實(shí)際才使用30%(看監(jiān)控圖表)不到横腿,所以排除這種情況。
  • 配置了ExplictGCInvokesConcurrent且未配置DisableExplicitGC的情況下顯示調(diào)用了System.gc()斤寂。
  • Hotspot自己根據(jù)估計(jì)決定是否要觸法耿焊,如CMS悲觀策略,這類可以通過GC日志分析遍搞。

大致判斷很可能是System.gc()導(dǎo)致的問題罗侯,但是怎么定位調(diào)用System.gc()的代碼呢?

當(dāng)時(shí)就想如果是System.gc()引起的頻繁Full GC溪猿,jstack線程堆棧應(yīng)該能看到一些信息钩杰,果不其然纫塌,確實(shí)通過線程堆棧找到了。
jstack線程堆棧

jstack作用非常大讲弄,很多問題都能從這里發(fā)現(xiàn)措左,而且比較輕量,對應(yīng)用基本無影響避除。某次的jstack信息只代表那個(gè)時(shí)刻的線程堆棧怎披,有時(shí)只看一個(gè)jstack信息可能看不出什么問題,一般可以多jstack幾次瓶摆,然后對比去看凉逛,基本就能發(fā)現(xiàn)一些問題。
(當(dāng)然該問題群井,也可能不是頻繁的Full GC状飞,可能通過jstack定位不到問題,可以jstat -gccause pid 1000书斜,來查看gc原因诬辈。)

很明顯,是由于jxl這個(gè)包中的close方法顯示調(diào)用了System.gc()導(dǎo)致的問題荐吉。

跟了下代碼焙糟,自然確實(shí)存在這段代碼,不過有個(gè)設(shè)置開關(guān)稍坯,可以disable這個(gè)功能酬荞,所以在使用的時(shí)候可以設(shè)置setGCDisabled(true),關(guān)閉觸發(fā)System.gc()瞧哟。
觸發(fā)System.gc()代碼

但是為什么老應(yīng)用沒有問題呢混巧,主要是因?yàn)樗?-XX:+DisableExplicitGC,屏蔽了System.gc()動作勤揩,新應(yīng)用的JVM沒有這個(gè)配置咧党。

可能大家還有個(gè)疑問,都知道System.gc()會觸發(fā)Full GC陨亡,那為什么一直進(jìn)行CMS GC(通過GC日志)呢傍衡?
主要是因?yàn)檫@個(gè)參數(shù)-XX:+ExplicitGCInvokesConcurrent,打開此參數(shù)后负蠕,會做并行Full GC蛙埂,只有配置-XX:+UseConcMarkSweepGC這個(gè)參數(shù),該參數(shù)才會生效遮糖。因此绣的,System.gc()時(shí)Old區(qū)會進(jìn)行CMS GC,可提高Full GC效率。

總結(jié)

盡量減少顯示使用System.gc()來觸發(fā)Full GC屡江,這會導(dǎo)致頻繁Full GC芭概,非常影響應(yīng)用性能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惩嘉,一起剝皮案震驚了整個(gè)濱河市罢洲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌文黎,老刑警劉巖惹苗,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臊诊,居然都是意外死亡鸽粉,警方通過查閱死者的電腦和手機(jī)斜脂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門抓艳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帚戳,你說我怎么就攤上這事玷或。” “怎么了片任?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵偏友,是天一觀的道長。 經(jīng)常有香客問我对供,道長位他,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任产场,我火速辦了婚禮,結(jié)果婚禮上京景,老公的妹妹穿的比我還像新娘醒串。我一直安慰自己,他們只是感情好缠沈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畜伐,像睡著了一般玛界。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笨枯,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天粱檀,我揣著相機(jī)與錄音压彭,去河邊找鬼壮不。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绊诲。 我是一名探鬼主播抗俄,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胰蝠!你這毒婦竟也來了茸塞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤无切,失蹤者是張志新(化名)和其女友劉穎瘦锹,沒想到半個(gè)月后辱士,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡听绳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年颂碘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椅挣。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡头岔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼠证,到底是詐尸還是另有隱情峡竣,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布量九,位于F島的核電站适掰,受9級特大地震影響颂碧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜类浪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一载城、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧费就,春花似錦个曙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艳汽,卻和暖如春猴贰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背河狐。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工米绕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馋艺。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓栅干,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捐祠。 傳聞我的和親對象是個(gè)殘疾皇子碱鳞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 作者:一字馬胡 轉(zhuǎn)載標(biāo)志 【2017-11-12】 更新日志 日期更新內(nèi)容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,211評論 0 7
  • 原文閱讀 前言 這段時(shí)間懈怠了,罪過踱蛀! 最近看到有同事也開始用上了微信公眾號寫博客了窿给,挺好的~給他們點(diǎn)贊,這博客我...
    碼農(nóng)戲碼閱讀 5,994評論 2 31
  • System.gc整理 System.gc()源碼public static void gc() { Runtim...
    andersonoy閱讀 2,947評論 0 1
  • 參數(shù)設(shè)置 在Java虛擬機(jī)的參數(shù)中率拒,有3種表示方法用“ps -ef |grep "java"命令崩泡,可以得到當(dāng)前Ja...
    九問閱讀 9,154評論 2 52
  • 在微信公眾號“7527”上已經(jīng)推送了一個(gè)月的文章,不是朝著成功的方向而去猬膨,而是想看看這到底是一個(gè)怎樣的平臺角撞,想知道...
    殘劍閱讀 367評論 0 1