成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

阿里小哥帶你玩轉(zhuǎn)JVM:揭秘try-catch-finally在JVM底層都干了些啥?

番茄西紅柿 / 2077人閱讀

摘要:當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個(gè)異常表?xiàng)l目的監(jiān)控范圍內(nèi),虛擬機(jī)會(huì)判斷所拋出的異常和該條目想要捕獲的異常是否匹配。

作者:李瑞杰
目前就職于阿里巴巴,狂熱JVM愛(ài)好者


讓我們準(zhǔn)備一個(gè)函數(shù):



然后,反編譯他的字節(jié)碼:



首先我們介紹異常表:在編譯生成的字節(jié)碼中,每個(gè)方法都附帶一個(gè)異常表。

異常表中的每一個(gè)條目代表一個(gè)異常處理器,并且由 from 指針、to 指針、target 指針以及所捕獲的異常類型構(gòu)成。這些指針的值是字節(jié)碼索引用以定位字節(jié)碼。

下圖就是我特別指出的JVM字節(jié)碼中的異常表部分。


我們來(lái)分析一下這幾個(gè)語(yǔ)句的執(zhí)行流程,首先執(zhí)行:


這相當(dāng)于執(zhí)行:


再來(lái):


上圖相當(dāng)于執(zhí)行


有人問(wèn):try去哪了?

我馬上就要介紹。此時(shí)idiv執(zhí)行完就有異常了,有異常了先找異常表。


我再貼一下異常表,他是怎么搜索的呢?

當(dāng)程序觸發(fā)異常時(shí),Java 虛擬機(jī)會(huì)從上至下遍歷異常表中的所有條目。

當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個(gè)異常表?xiàng)l目的監(jiān)控范圍內(nèi),Java 虛擬機(jī)會(huì)判斷所拋出的異常和該條目想要捕獲的異常是否匹配。

如果匹配,Java 虛擬機(jī)會(huì)將控制流轉(zhuǎn)移至該條目 target 指針指向的字節(jié)碼。

我們看 ,是第四個(gè)索引指向的字節(jié)碼出了問(wèn)題,顯然,此時(shí)應(yīng)該匹配紅線這一條記錄,從而跳轉(zhuǎn)到第14個(gè)索引的字節(jié)碼。


我們看他怎么做的?


new出一個(gè)RuntimeException并拋出,它就是


這一句,按照我們剛才的流程,此時(shí)依然需要找到這個(gè)RuntimeException在哪個(gè)異常表的條目中


此時(shí)匹配到異常表的條目,跳轉(zhuǎn)到字節(jié)碼索引23


繼續(xù)拋出RuntimeExcpetion,可以注意到 這實(shí)際上對(duì)應(yīng)了


這個(gè)語(yǔ)句,于是我們可以知道,在三個(gè)都出現(xiàn)異常的情況下,實(shí)際上最終向外拋出的異常是finally里面的異常。

可以看到當(dāng)31索引處調(diào)用athrow語(yǔ)句拋出異常時(shí),此時(shí)異常表沒(méi)有任何一個(gè)條目能夠匹配該異常,此時(shí)怎么辦呢?


如果遍歷完所有異常表?xiàng)l目,Java 虛擬機(jī)仍未匹配到異常處理器,那么它會(huì)彈出當(dāng)前方法對(duì)應(yīng)的 Java 棧幀,并且在調(diào)用者中重復(fù)上述操作。

在最壞情況下,Java 虛擬機(jī)需要遍歷當(dāng)前線程 Java 棧上所有方法的異常表。

事實(shí)上分析以上的整體的全部語(yǔ)句你可以發(fā)現(xiàn),jvm層面有真正的finally嗎?

沒(méi)有

現(xiàn)在的做法是,復(fù)制 finally 代碼塊的內(nèi)容,分別放在 try-catch 代碼塊所有正常執(zhí)行路徑以及異常執(zhí)行路徑的出口中。無(wú)論是否出現(xiàn)異常,確保一定會(huì)執(zhí)行finally語(yǔ)句。

剛才catch出了異常,依然執(zhí)行finally語(yǔ)句就可以發(fā)現(xiàn)這一點(diǎn)。至于其他路徑,大家可以自行驗(yàn)證。我就在這里拋磚引玉了。

至于為什么2-6發(fā)生任何異常都跳轉(zhuǎn)到23?大家可以自己想一下這個(gè)問(wèn)題。

我就提示一點(diǎn) 2-6 target為14的條目代表的catch是不能捕獲所有異常的,但是你要確保finally的語(yǔ)句能夠執(zhí)行。而2-6恰巧是try語(yǔ)句塊的內(nèi)容。23這個(gè)索引恰巧是finally語(yǔ)句的一份復(fù)制。

END

個(gè)人公眾號(hào):石杉的架構(gòu)筆記(ID:shishan100)

歡迎長(zhǎng)按下圖關(guān)注公眾號(hào):石杉的架構(gòu)筆記!

公眾號(hào)后臺(tái)回復(fù)資料,獲取作者獨(dú)家秘制學(xué)習(xí)資料

石杉的架構(gòu)筆記,BAT架構(gòu)經(jīng)驗(yàn)傾囊相授



文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7148.html

相關(guān)文章

  • 阿里小哥帶你玩轉(zhuǎn)JVM揭秘try-catch-finallyJVM底層都干些啥?

    摘要:當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個(gè)異常表?xiàng)l目的監(jiān)控范圍內(nèi),虛擬機(jī)會(huì)判斷所拋出的異常和該條目想要捕獲的異常是否匹配。 作者:李瑞杰目前就職于阿里巴巴,狂熱JVM愛(ài)好者讓我們準(zhǔn)備一個(gè)函數(shù):showImg(https://user-gold-cdn.xitu.io/2019/5/19/16acbce35adfefb7);然后,反編譯他的字節(jié)碼:showImg(https://user-gold-cd...

    番茄西紅柿 評(píng)論0 收藏0
  • 阿里小哥帶你玩轉(zhuǎn)JVM揭秘try-catch-finallyJVM底層都干些啥

    摘要:當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個(gè)異常表?xiàng)l目的監(jiān)控范圍內(nèi),虛擬機(jī)會(huì)判斷所拋出的異常和該條目想要捕獲的異常是否匹配。 作者:李瑞杰目前就職于阿里巴巴,狂熱JVM愛(ài)好者讓我們準(zhǔn)備一個(gè)函數(shù):showImg(https://user-gold-cdn.xitu.io/2019/5/19/16acbce35adfefb7);然后,反編譯他的字節(jié)碼:showImg(https://user-gold-cd...

    lykops 評(píng)論0 收藏0
  • swoft| 源碼解讀系列二: 啟動(dòng)階段, swoft 都干些啥?

    摘要:源碼解讀系列二啟動(dòng)階段都干了些啥閱讀框架源碼了解啟動(dòng)階段的那些事兒小伙伴剛接觸的時(shí)候會(huì)感覺(jué)壓力有點(diǎn)大更直觀的說(shuō)法是難開(kāi)發(fā)組是不贊成難這個(gè)說(shuō)法的的代碼都是實(shí)現(xiàn)的而又是世界上最好的語(yǔ)言的代碼閱讀起來(lái)是很輕松的之后開(kāi)發(fā)組會(huì)用系列源碼解讀文章深 date: 2018-8-01 14:22:17title: swoft| 源碼解讀系列二: 啟動(dòng)階段, swoft 都干了些啥?descriptio...

    hqman 評(píng)論0 收藏0
  • 老司機(jī)【分享】帶你玩轉(zhuǎn)阿里云服務(wù)器

    摘要:阿里云是國(guó)內(nèi)云服務(wù)器市場(chǎng)的龍頭,性價(jià)比高,速度快又安全,是站長(zhǎng)建站首選的云服務(wù)器之一。作為一個(gè)老司機(jī),福利吧也和大家分享一下我的阿里云推廣經(jīng)驗(yàn),教大家如何免費(fèi)推廣云大使。阿里云是國(guó)內(nèi)云服務(wù)器市場(chǎng)的龍頭,性價(jià)比高,速度快又安全,是站長(zhǎng)建站首選的云服務(wù)器之一。福利吧使用的也是阿里云服務(wù)器,是折騰了很多次網(wǎng)站搬家后,才選擇了阿里云。身邊好幾個(gè)站長(zhǎng)最后都殊途同歸,用了阿里云,可見(jiàn)阿里云服務(wù)器性能確實(shí)...

    banana_pi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<