異常洋魂、堆內(nèi)存溢出绷旗、OOM的幾種情況

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載副砍。

目錄(?)[+]

1堆內(nèi)存溢出

2Java異常

OOM

1衔肢、堆內(nèi)存溢出

【情況一】:

Java.lang.OutOfMemoryError:Javaheap space:這種是java堆內(nèi)存不夠,一個原因是真不夠豁翎,另一個原因是程序中有死循環(huán)角骤;

如果是java堆內(nèi)存不夠的話,可以通過調(diào)整JVM下面的配置來解決:

< jvm-arg>-Xms3062m < / jvm-arg>

< jvm-arg>-Xmx3062m < / jvm-arg>

【情況二】

java.lang.OutOfMemoryError: GC overhead limit exceeded

【解釋】:JDK6新增錯誤類型心剥,當(dāng)GC為釋放很小空間占用大量時間時拋出邦尊;一般是因為堆太小,導(dǎo)致異常的原因优烧,沒有足夠的內(nèi)存蝉揍。

【解決方案】:

1、查看系統(tǒng)是否有使用大內(nèi)存的代碼或死循環(huán)畦娄;

2又沾、通過添加JVM配置,來限制使用內(nèi)存:

< jvm-arg>-XX:-UseGCOverheadLimit< /jvm-arg>

【情況三】:

java.lang.OutOfMemoryError: PermGen space:這種是P區(qū)內(nèi)存不夠熙卡,可通過調(diào)整JVM的配置:

< jvm-arg>-XX:MaxPermSize=128m< /jvm-arg>

< jvm-arg>-XXermSize=128m< /jvm-arg>

【注】:

JVM的Perm區(qū)主要用于存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space杖刷,這個區(qū)域成為年老代,GC在主程序運行期間不會對年老區(qū)進(jìn)行清理驳癌,默認(rèn)是64M大小滑燃,當(dāng)程序需要加載的對象比較多時,超過64M就會報這部分內(nèi)存溢出了喂柒,需要加大內(nèi)存分配不瓶,一般128m足夠禾嫉。

【情況四】:

java.lang.OutOfMemoryError: Direct buffer memory

調(diào)整-XX:MaxDirectMemorySize= 參數(shù),如添加JVM配置:

< jvm-arg>-XX:MaxDirectMemorySize=128m< /jvm-arg>

【情況五】:

java.lang.OutOfMemoryError: unable to create new native thread

【原因】:Stack空間不足以創(chuàng)建額外的線程蚊丐,要么是創(chuàng)建的線程過多熙参,要么是Stack空間確實小了。

【解決】:由于JVM沒有提供參數(shù)設(shè)置總的stack空間大小麦备,但可以設(shè)置單個線程棧的大心跻;而系統(tǒng)的用戶空間一共是3G凛篙,除了Text/Data/BSS /MemoryMapping幾個段之外黍匾,Heap和Stack空間的總量有限,是此消彼長的呛梆。因此遇到這個錯誤锐涯,可以通過兩個途徑解決:

1.通過 -Xss啟動參數(shù)減少單個線程棧大小,這樣便能開更多線程(當(dāng)然不能太小填物,太小會出現(xiàn)StackOverflowError)纹腌;

2.通過-Xms -Xmx 兩參數(shù)減少Heap大小,將內(nèi)存讓給Stack(前提是保證Heap空間夠用)滞磺。

【情況六】:

java.lang.StackOverflowError

【原因】:這也內(nèi)存溢出錯誤的一種升薯,即線程棧的溢出,要么是方法調(diào)用層次過多(比如存在無限遞歸調(diào)用)击困,要么是線程棧太小涎劈。

【解決】:優(yōu)化程序設(shè)計,減少方法調(diào)用層次阅茶;調(diào)整-Xss參數(shù)增加線程棧大小蛛枚。

2、Java異常

Throwable

Throwable是 Java 語言中所有錯誤或異常的超類目派。

Throwable包含兩個子類: Error 和 Exception 坤候。它們通常用于指示發(fā)生了異常情況胁赢。

Throwable包含了其線程創(chuàng)建時線程執(zhí)行堆棧的快照企蹭,它提供了printStackTrace()等接口用于獲取堆棧跟蹤數(shù)據(jù)等信息。

Exception

Exception及其子類是 Throwable 的一種形式智末,它指出了合理的應(yīng)用程序想要捕獲的條件谅摄。

RuntimeException

RuntimeException是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。

編譯器不會檢查RuntimeException異常系馆。例如送漠,除數(shù)為零時,拋出ArithmeticException異常由蘑。RuntimeException是ArithmeticException的超類闽寡。當(dāng)代碼發(fā)生除數(shù)為零的情況時代兵,倘若既”沒有通過throws聲明拋出ArithmeticException異常”爷狈,也”沒有通過try…catch…處理該異持灿埃”,也能通過編譯涎永。這就是我們所說的”編譯器不會檢查RuntimeException異乘急遥”!

如果代碼會產(chǎn)生RuntimeException異常羡微,則需要通過修改代碼進(jìn)行避免谷饿。 例如,若會發(fā)生除數(shù)為零的情況妈倔,則需要通過代碼避免該情況的發(fā)生博投!

Error

和Exception一樣, Error也是Throwable的子類盯蝴。 它用于指示合理的應(yīng)用程序不應(yīng)該試圖捕獲的嚴(yán)重問題贬堵,大多數(shù)這樣的錯誤都是異常條件。

和RuntimeException一樣结洼,編譯器也不會檢查Error黎做。

Java將可拋出(Throwable)的結(jié)構(gòu)分為三種類型:被檢查的異常(Checked Exception),運行時異常(RuntimeException)和錯誤(Error)松忍。

(01) 運行時異常

定義 : RuntimeException及其子類都被稱為運行時異常蒸殿。

特點 :Java編譯器不會檢查它。 也就是說鸣峭,當(dāng)程序中可能出現(xiàn)這類異常時宏所,倘若既”沒有通過throws聲明拋出它”,也”沒有用try-catch語句捕獲它”摊溶,還是會編譯通過爬骤。例如,除數(shù)為零時產(chǎn)生的ArithmeticException異常莫换,數(shù)組越界時產(chǎn)生的IndexOutOfBoundsException異常霞玄,fail-fail機制產(chǎn)生的ConcurrentModificationException異常等,都屬于運行時異常拉岁。

雖然Java編譯器不會檢查運行時異常坷剧,但是我們也可以通過throws進(jìn)行聲明拋出,也可以通過try-catch對它進(jìn)行捕獲處理喊暖。

如果產(chǎn)生運行時異常惫企,則需要通過修改代碼來進(jìn)行避免。 例如陵叽,若會發(fā)生除數(shù)為零的情況狞尔,則需要通過代碼避免該情況的發(fā)生丛版!

(02) 被檢查的異常

定義 :? Exception類本身,以及Exception的子類中除了”運行時異称颍”之外的其它子類都屬于被檢查異常硼婿。

特點 :Java編譯器會檢查它此類異常禽车,要么通過throws進(jìn)行聲明拋出寇漫,要么通過try-catch進(jìn)行捕獲處理,否則不能通過編譯殉摔。例如州胳,CloneNotSupportedException就屬于被檢查異常。當(dāng)通過clone()接口去克隆一個對象逸月,而該對象對應(yīng)的類沒有實現(xiàn)Cloneable接口栓撞,就會拋出CloneNotSupportedException異常。

被檢查異常通常都是可以恢復(fù)的碗硬。

(03) 錯誤

定義 : Error類及其子類瓤湘。

特點 : 和運行時異常一樣,編譯器也不會對錯誤進(jìn)行檢查恩尾。

當(dāng)資源不足弛说、約束失敗、或是其它程序無法繼續(xù)運行的條件發(fā)生時翰意,就產(chǎn)生錯誤木人。程序本身無法修復(fù)這些錯誤的。例如冀偶,VirtualMachineError就屬于錯誤醒第。

按照J(rèn)ava慣例,我們是不應(yīng)該是實現(xiàn)任何新的Error子類的进鸠!

對于上面的3種結(jié)構(gòu)稠曼,我們在拋出異常或錯誤時客年,到底該哪一種霞幅?《Effective Java》中給出的建議是:對于可以恢復(fù)的條件使用被檢查異常,對于程序錯誤使用運行時異常搀罢。

OOM

1蝗岖,? OutOfMemoryError異常

除了程序計數(shù)器外,虛擬機內(nèi)存的其他幾個運行時區(qū)域都有發(fā)生OutOfMemoryError(OOM)異常的可能榔至,

javaHeap 溢出

一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess

java堆用于存儲對象實例,我們只要不斷的創(chuàng)建對象欺劳,并且保證GC Roots到對象之間有可達(dá)路徑來避免垃圾回收機制清除這些對象唧取,就會在對象數(shù)量達(dá)到最大堆容量限制后產(chǎn)生內(nèi)存溢出異常铅鲤。

出現(xiàn)這種異常,一般手段是先通過內(nèi)存映像分析工具(如Eclipse Memory

Analyzer)對dump出來的堆轉(zhuǎn)存快照進(jìn)行分析枫弟,重點是確認(rèn)內(nèi)存中的對象是否是必要的邢享,先分清是因為內(nèi)存泄漏(Memory

Leak)還是內(nèi)存溢出(Memory Overflow)。

如果是內(nèi)存泄漏淡诗,可進(jìn)一步通過工具查看泄漏對象到GC Roots的引用鏈骇塘。于是就能找到泄漏對象時通過怎樣的路徑與GC Roots相關(guān)聯(lián)并導(dǎo)致垃圾收集器無法自動回收。

如果不存在泄漏韩容,那就應(yīng)該檢查虛擬機的參數(shù)(-Xmx與-Xms)的設(shè)置是否適當(dāng)款违。

2,? 虛擬機棧和本地方法棧溢出

如果線程請求的棧深度大于虛擬機所允許的最大深度群凶,將拋出StackOverflowError異常插爹。

如果虛擬機在擴展棧時無法申請到足夠的內(nèi)存空間,則拋出OutOfMemoryError異常

這里需要注意當(dāng)棧的大小越大可分配的線程數(shù)就越少请梢。

3赠尾,? 運行時常量池溢出

異常信息:java.lang.OutOfMemoryError:PermGen space

如果要向運行時常量池中添加內(nèi)容,最簡單的做法就是使用String.intern()這個Native方法毅弧。該方法的作用是:如果池中已經(jīng)包含一個等于此String的字符串气嫁,則返回代表池中這個字符串的String對象;否則够坐,將此String對象包含的字符串添加到常量池中杉编,并且返回此String對象的引用。由于常量池分配在方法區(qū)內(nèi)咆霜,我們可以通過-XX:PermSize和-XX:MaxPermSize限制方法區(qū)的大小邓馒,從而間接限制其中常量池的容量。

4蛾坯,? 方法區(qū)溢出

方法區(qū)用于存放Class的相關(guān)信息光酣,如類名、訪問修飾符脉课、常量池救军、字段描述、方法描述等倘零。

異常信息:java.lang.OutOfMemoryError:PermGen space

方法區(qū)溢出也是一種常見的內(nèi)存溢出異常唱遭,一個類如果要被垃圾收集器回收,判定條件是很苛刻的呈驶。在經(jīng)常動態(tài)生成大量Class的應(yīng)用中拷泽,要特別注意這點。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市司致,隨后出現(xiàn)的幾起案子拆吆,更是在濱河造成了極大的恐慌,老刑警劉巖脂矫,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枣耀,死亡現(xiàn)場離奇詭異,居然都是意外死亡庭再,警方通過查閱死者的電腦和手機捞奕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拄轻,“玉大人颅围,你說我怎么就攤上這事〔该校” “怎么了谷浅?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奶卓。 經(jīng)常有香客問我一疯,道長,這世上最難降的妖魔是什么夺姑? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任墩邀,我火速辦了婚禮,結(jié)果婚禮上盏浙,老公的妹妹穿的比我還像新娘眉睹。我一直安慰自己,他們只是感情好废膘,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布竹海。 她就那樣靜靜地躺著,像睡著了一般丐黄。 火紅的嫁衣襯著肌膚如雪斋配。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天灌闺,我揣著相機與錄音艰争,去河邊找鬼。 笑死桂对,一個胖子當(dāng)著我的面吹牛甩卓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕉斜,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼逾柿,長吁一口氣:“原來是場噩夢啊……” “哼缀棍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹿寻,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤睦柴,失蹤者是張志新(化名)和其女友劉穎诽凌,沒想到半個月后毡熏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡侣诵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年痢法,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杜顺。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡财搁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躬络,到底是詐尸還是另有隱情尖奔,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布穷当,位于F島的核電站提茁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏馁菜。R本人自食惡果不足惜茴扁,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汪疮。 院中可真熱鬧峭火,春花似錦、人聲如沸智嚷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盏道。三九已至稍浆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摇天,已是汗流浹背粹湃。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泉坐,地道東北人为鳄。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像腕让,于是被迫代替她去往敵國和親孤钦。 傳聞我的和親對象是個殘疾皇子歧斟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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

  • JVM內(nèi)存模型Java虛擬機(Java Virtual Machine=JVM)的內(nèi)存空間分為五個部分,分別是: ...
    光劍書架上的書閱讀 2,514評論 2 26
  • Java8張圖 11偏形、字符串不變性 12静袖、equals()方法、hashCode()方法的區(qū)別 13俊扭、...
    Miley_MOJIE閱讀 3,707評論 0 11
  • 嘎吱嘎吱的咬嚼聲队橙,在晚上夜深人靜時特別明顯。自從家里二樓裝空調(diào)在外墻打了個洞萨惑,后來因為位置不對棄置捐康,又因偷懶沒有及...
    遐想的天空閱讀 637評論 0 0
  • 三年前,他和她是無話不談的朋友庸蔼。談?wù)谓庾堋矍椤W(xué)習(xí)姐仅,他們什么都能談花枫,能夠談到深更半夜都沒有關(guān)系。 然后掏膏,忽然有一天...
    laviedX閱讀 171評論 0 0
  • 其實我也不知道應(yīng)該如何形容這幅畫劳翰,本來想畫一層的,結(jié)果畫面結(jié)構(gòu)不好壤追,又加了一層磕道,畫樹的時候情不自禁的只畫了半邊,然...
    GraceAn閱讀 351評論 0 0