OOM 和 FGC異常排查

概述

OOM:

  • JVM一般都是先嘗試GC,GC以后仍然無法騰出空間給新對象的時候才會針對對應線程觸發(fā)OOM
  • 另外OOM只是一個求救信號咧叭,JVM的一種自我保護機制蚀乔,會自動停止導致異常的線程,但是不會導致整個應用的崩潰
  • 觸發(fā)OOM的原因:池子太小菲茬,對象太大(加載的東西太多吉挣、單個對象太大、無法及時釋放資源)
  • OOM的解決方案:(Perm婉弹、Heap) check內存配置睬魂、根據報錯信息 或者 dump快照定位大對象的來源

OOM觸發(fā)的幾種情況:

  1. Heap不夠:java.lang.OutOfMemoryError: Java heap space :設置 -Xms 來解決
  2. Perm不夠:java.lang.OutOfMemoryError: PermGen space:加載了太多的類或者常量池太大了:設置-XX:MaxPermSize
  3. 棧區(qū)不夠:(StackOverFlowError、java.lang.OutOfMemoryError: unable to create new native thread)

觸發(fā)FGC的方法:

  1. 主動觸發(fā):System.gc()镀赌、命令觸發(fā)(jmap -dump:live)氯哮、工具觸發(fā)(jconsol)
  2. 老年代內存不足:真不足、預判不足佩脊、內存碎片蛙粘、CMS 晉升失敗、配置太小
  3. Perm區(qū)內存不足:加載太多的類威彰、配置太小

OOM的排查

  1. 導致OutOfMemoryError異常的常見原因有以下幾種:
  • 內存中加載的數據量過于龐大出牧,如一次從數據庫取出過多數據,取了又無法釋放歇盼,不能GC
  • 集合類中有對對象的引用舔痕,使用完后未清空,使得JVM不能回收豹缀;
  • 代碼中存在死循環(huán)或循環(huán)產生過多重復的對象實體伯复;
  • 使用的第三方軟件中的BUG;
  • 啟動參數內存值設定的過小
  1. OutOfMemoryError: PermGen space
  • 問題分析: 加載了太多的類邢笙,比如第三方jar包啸如。或者加載了太多的JSP氮惯。
  • 解決方案: 增加java虛擬機中的XX:PermSize和XX:MaxPermSize參數的大小
  1. OutOfMemoryError: Java heap space
  • 檢查程序叮雳,看是否有死循環(huán)或不必要地重復創(chuàng)建大量對象想暗。找到原因后,修改程序和算法帘不。
  • 增加Java虛擬機中Xms(初始堆大兴的)和Xmx(最大堆大小)參數的大小寞焙。如:set JAVA_OPTS= -Xms256m -Xmx1024m
  1. 常見代碼引起的OOM的情況
  • 檢查代碼中是否有死循環(huán)或遞歸調用储狭。
  • 檢查是否有大循環(huán)重復產生新對象實體。
  • 檢查對數據庫查詢中捣郊,是否有一次獲得全部數據的查詢辽狈。一般來說,如果一次取十萬條記錄到內存呛牲,就可能引起內存溢出稻艰。這個問題比較隱蔽,在上線前侈净,數據庫中數據較少,不容易出問題僧凤,上線后畜侦,數據庫中數據多了,一次查詢就有可能引起內存溢出躯保。因此對于數據庫查詢盡量采用分頁的方式查詢旋膳。
  • 檢查List、MAP等集合對象是否有使用完后途事,未清除的問題验懊。List、MAP等集合對象會始終存有對對象的引用尸变,使得這些對象不能被GC回收义图。

常用JVM異常排查手段

  1. 監(jiān)控工具的使用,自帶的JConsole召烂、visualVM的使用
  • 圖形化顯示 堆區(qū)內存變化碱工、線程數、CPU使用等情況
  • visualVM可以直接生成內存快照奏夫、線程快照怕篷,也可以直接幫你計算最大的20個Object
  1. 常用命令:
  • jmap (-heap 查看堆區(qū)的配置信息)
  • jstat(gcutil看即時的各個區(qū)域的變化情況、capacity查看容量情況)
  1. gc日志分析(啟動的時候設置參數酗昼,生成gc日志廊谓,然后用工具分析gc日志,比如FGC的次數麻削、YGC的次數等信息)

  2. 快照分析(可以通過工具蒸痹、命令春弥、或者啟動參數配置獲取到快照,然后利用工具分析)

FullGC觸發(fā)的情況

  1. 老年代空間不足:
  • 真不足电抚,新生代出來的對象進入老年代惕稻,而老年代的剩余空間不足
  • 預判不足,統計得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間
  • 連續(xù)不足蝙叛,如果是CMS的話俺祠,即使內存剩余夠。但是內存碎片太多借帘,沒有連續(xù)的內存裝下原本可以裝下的對象
  • 緊急不足蜘渣,CMS在Major GC的時候,因為是并發(fā)清除肺然,未完成MGC時新垃圾產生蔫缸,而剩余空間不足,也會觸發(fā)FullGC际起,而且是以Serial Old單線程的形式執(zhí)行拾碌。CMS的Major GC約等于FullGC的,因為一般都是YGC產生垃圾要進入老年代街望,而老年代又不足的時候才會觸發(fā)MajorGC校翔,這就是一個完整的FullGC啊。但是也不排除設置了大對象直接進入老年代灾前,這樣的話防症,可能沒有YGC,就直接進入老年代觸發(fā)MajorGC了

解決方案:調優(yōu)時應盡量做到讓對象在Minor GC階段被回收

  • 調大堆區(qū)的大小哎甲,默認MaxSize是總內存的1/4蔫敲,初始值是1/64
  • 代碼里面,盡量不要有太大的對象產生炭玫,可以用分批讀取奈嘿,讓該對象不直接進入老年代,而是被YGC回收掉
  • 調大年輕代的大小
  • 調大存活ratio吞加,默認是15
  1. Perm區(qū)滿了:解決方案:調大Perm區(qū)的大小指么,或者代碼中不要加載過多的class

  2. 代碼調用 System.gc()×穸Γ可以設置jvm參數伯诬,禁止程序調用這個方法。

  3. jmap -histo:live pid 暴力GC巫财,直接用命令

  4. CMS的GC非常特殊盗似,其它的SerialOld和Parallel Old回收器在老年代滿了都是進行Full GC,而唯獨CMS不是這樣平项,CMS會定時檢測老年代的占用比例赫舒,超過一定的比例就會觸發(fā)老年代的GC悍及。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市接癌,隨后出現的幾起案子心赶,更是在濱河造成了極大的恐慌,老刑警劉巖缺猛,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缨叫,死亡現場離奇詭異,居然都是意外死亡荔燎,警方通過查閱死者的電腦和手機耻姥,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來有咨,“玉大人琐簇,你說我怎么就攤上這事∽恚” “怎么了婉商?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長渣叛。 經常有香客問我据某,道長,這世上最難降的妖魔是什么诗箍? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮挽唉,結果婚禮上滤祖,老公的妹妹穿的比我還像新娘。我一直安慰自己瓶籽,他們只是感情好匠童,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著塑顺,像睡著了一般汤求。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上严拒,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天扬绪,我揣著相機與錄音,去河邊找鬼裤唠。 笑死挤牛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的种蘸。 我是一名探鬼主播墓赴,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼竞膳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诫硕?” 一聲冷哼從身側響起坦辟,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎章办,沒想到半個月后锉走,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡纲菌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年挠日,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翰舌。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚣潜,死狀恐怖,靈堂內的尸體忽然破棺而出椅贱,到底是詐尸還是另有隱情懂算,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布庇麦,位于F島的核電站计技,受9級特大地震影響,放射性物質發(fā)生泄漏山橄。R本人自食惡果不足惜垮媒,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望航棱。 院中可真熱鬧睡雇,春花似錦、人聲如沸饮醇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朴艰。三九已至观蓄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祠墅,已是汗流浹背侮穿。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毁嗦,地道東北人撮珠。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芯急。 傳聞我的和親對象是個殘疾皇子勺届,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容