java基礎(chǔ)-Exception與Error包結(jié)構(gòu)艰管,OOM,SOF你遇到哪些情況蒋川?

轉(zhuǎn)載自http://www.reibang.com/p/473c7b8b3bf3

java異常架構(gòu)圖

Throwable

throwable類是所有的錯誤或異常的超類牲芋。只有對象是此類或其子類的實例之一時,才能通過JVM或者通過throw語句拋出。另外catch字句中的參數(shù)類型也必須是該類型缸浦。

Throwable包含兩個子類:Error和Excaption夕冲。他們通常用于指示發(fā)生了異常情況。Throwable類和子類的兩個構(gòu)造方法:

  • 不帶參數(shù)
  • 帶String參數(shù)

Exception

Exception及其子類是Throwable的一種形式餐济,它指出了合理的應(yīng)用程序要想捕獲的條件。對于可以恢復(fù)的條件使用“被檢查異车ň纾”(Exception的子類中除了RuntimeException之外的其他子類)絮姆,對于程序錯誤用“運行時異常”

RuntimeException

RuntimeException是那些可能在Java虛擬機正常運行期間拋出的異常的超類秩霍。編譯器不會檢查RuntimeException異常篙悯。例如,除數(shù)為0铃绒,拋出ArithmeticException異常鸽照。當(dāng)程序中可能出現(xiàn)這類異常時,還是會編譯通過颠悬。雖然java編譯器不會檢查運行異常矮燎,但是我們也可以通過throws進(jìn)行聲明拋出,也可以通過try-catch對它進(jìn)行捕獲處理赔癌。

Error

和Exception一樣诞外,Error也是Throwable的子類。它用于指示合理的應(yīng)用程序不應(yīng)該試圖捕獲的嚴(yán)重問題灾票,大多數(shù)這樣的錯誤都是異常條件峡谊。
和RuntimeException一樣,編譯器也不會檢查Error刊苍。


java可將可拋出(Throwable)的異常分為是3種類型:被檢查的異常(Checked Exception)既们、運行時異常(Runtime Exception)和錯誤(Error)

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

ArithmeticException:當(dāng)出現(xiàn)異常的運算條件時正什,拋出此異常啥纸。例如,一個整數(shù)“除以零”時婴氮,拋出此類的一個實例脾拆。
ClassCastException:當(dāng)試圖將對象強制轉(zhuǎn)換為不是實例的子類時,拋出該異常莹妒。例如:Object x = new Integer(0);
LllegalArgumentException:拋出的異常表明向方法傳遞了一個不合法或不正確的參數(shù)名船。
IllegalStateException:在非法或不適當(dāng)?shù)臅r間調(diào)用方法時產(chǎn)生的信號。換句話說旨怠,即Java環(huán)境或Java應(yīng)用程序沒有處于請求操作所要求的適當(dāng)狀態(tài)下渠驼。
IndexOutOfBoundsException:指示某排序索引(例如對數(shù)組、字符串或向量的排序)超出范圍時拋出鉴腻。 應(yīng)用程序可以為這個類創(chuàng)建子類迷扇,以指示類似的異常百揭。
NoSuchElementException:由Enumeration的nextElement方法拋出,表明枚舉中沒有更多的元素蜓席。
NullPointerException:當(dāng)應(yīng)用程序試圖在需要對象的地方使用null時器一,拋出該異常。這種情況包括:
調(diào)用null對象的實例方法厨内。
訪問或修改null對象的字段祈秕。
將null作為一個數(shù)組,獲得其長度雏胃。
將null作為一個數(shù)組请毛,訪問或修改其時間片。
將null作為Throwable值拋出瞭亮。
應(yīng)用程序應(yīng)該拋出該類的實例方仿,指示其他對null對象的非法使用。

  • 被檢查的異常
    定義:Exception類本身统翩,以及其子類除了運行時異常之外其他的子類都屬于被檢查異常仙蚜。
    特點:java編譯器會檢查他,此類異常厂汗,要么通過throws進(jìn)行聲明描述鳍征,要么通過try-catch進(jìn)行捕獲處理,否則不能通過編譯面徽。例如艳丛,CloneNotSupportedException就屬于被檢查異常。當(dāng)通過clone()接口去克隆一個對象趟紊,而該對象對應(yīng)的類沒有實現(xiàn)Cloneable接口氮双,就會拋出CloneNotSupportedExeption異常,被檢查的異常通常都是可以恢復(fù)的霎匈。

  • 錯誤
    定義:Error類及其子類
    特點:和運行時異常一樣戴差,編譯器也不會對錯誤進(jìn)行檢查,當(dāng)資源不足铛嘱,約束失敗暖释、或是其他程序無法繼續(xù)運行發(fā)生的條件發(fā)生時,就產(chǎn)生錯誤墨吓。程序本身無法修復(fù)這些錯誤的球匕。例如,VirtuaMachineError就屬于錯誤帖烘。


OOM

1.OutOfMemoryError異常

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

java Heap 溢出

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

java堆用于存儲對象實例,我們只要不斷的創(chuàng)建對象照卦,并且保證GC Roots到對象之間有可達(dá)路徑來避免垃圾回收機制來清除這些對象式矫,就會在對象到達(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)存泄漏也稱作"存儲滲漏"瞬痘,用[動態(tài)存儲]分配函數(shù)動態(tài)開辟的空間故慈,在使用完畢后未釋放,結(jié)果導(dǎo)致一直占據(jù)該內(nèi)存單元图云。直到程序結(jié)束惯悠。(其實說白了就是該內(nèi)存空間使用完畢之后未回收)即所謂內(nèi)存泄漏邻邮。)還是內(nèi)存溢出(Memory Overflow)竣况。

如果是內(nèi)存泄漏,引用可進(jìn)一步通過工具查看泄漏對象到GC Roots的鏈筒严。于是就能找到泄露對象時是通過怎樣的途徑導(dǎo)致垃圾收集器無法自動回收丹泉。

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

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

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

如果虛擬機無法申請到足夠的內(nèi)存空間娶视,則拋出OutOfMemeryError異常

這里需要注意當(dāng)棧的大小越大晒哄,可分配的線程就越小。

3肪获、運行時常量池溢出

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

如果要向運行時常量池中添加內(nèi)容寝凌,最簡單的做法是使用String.interm()這個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)用中,要特別注意這點傲茄。


SOF

程序中一旦出現(xiàn)死循環(huán)或者是大量的遞歸調(diào)用毅访,在不斷壓棧過程中,造成棧容量超過默認(rèn)大小而導(dǎo)致溢出盘榨。

棧溢出的原因:

  • 遞歸調(diào)用
  • 大量循環(huán)或死循環(huán)
  • 全局變量是否過多
  • 數(shù)組喻粹、List 、map數(shù)據(jù)過
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末草巡,一起剝皮案震驚了整個濱河市守呜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌山憨,老刑警劉巖查乒,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異郁竟,居然都是意外死亡玛迄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門棚亩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓖议,“玉大人,你說我怎么就攤上這事讥蟆±障海” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵攻询,是天一觀的道長从撼。 經(jīng)常有香客問我,道長钧栖,這世上最難降的妖魔是什么低零? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拯杠,結(jié)果婚禮上掏婶,老公的妹妹穿的比我還像新娘。我一直安慰自己潭陪,他們只是感情好雄妥,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布最蕾。 她就那樣靜靜地躺著,像睡著了一般老厌。 火紅的嫁衣襯著肌膚如雪瘟则。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天枝秤,我揣著相機與錄音醋拧,去河邊找鬼。 笑死淀弹,一個胖子當(dāng)著我的面吹牛丹壕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播薇溃,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼菌赖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沐序?” 一聲冷哼從身側(cè)響起琉用,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄啥,沒想到半個月后辕羽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逛尚,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡垄惧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绰寞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片到逊。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滤钱,靈堂內(nèi)的尸體忽然破棺而出觉壶,到底是詐尸還是另有隱情,我是刑警寧澤件缸,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布铜靶,位于F島的核電站,受9級特大地震影響他炊,放射性物質(zhì)發(fā)生泄漏争剿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一痊末、第九天 我趴在偏房一處隱蔽的房頂上張望蚕苇。 院中可真熱鬧,春花似錦凿叠、人聲如沸涩笤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹬碧。三九已至舱禽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恩沽,已是汗流浹背呢蔫。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留飒筑,地道東北人片吊。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像协屡,于是被迫代替她去往敵國和親俏脊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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