资讯专栏INFORMATION COLUMN

阿里小哥带你玩转JVM:揭秘try-catch-finally在JVM底层都干了些啥?

lykops / 2109人阅读

摘要:当触发异常的字节码的索引值在某个异常表条目的监控范围内,虚拟机会判断所抛出的异常和该条目想要捕获的异常是否匹配。

作者:李瑞杰
目前就职于阿里巴巴,狂热JVM爱好者


让我们准备一个函数:



然后,反编译他的字节码:



首先我们介绍异常表:在编译生成的字节码中,每个方法都附带一个异常表。

异常表中的每一个条目代表一个异常处理器,并且由 from 指针、to 指针、target 指针以及所捕获的异常类型构成。这些指针的值是字节码索引用以定位字节码。

下图就是我特别指出的JVM字节码中的异常表部分。


我们来分析一下这几个语句的执行流程,首先执行:


这相当于执行:


再来:


上图相当于执行


有人问:try去哪了?

我马上就要介绍。此时idiv执行完就有异常了,有异常了先找异常表。


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

当程序触发异常时,Java 虚拟机会从上至下遍历异常表中的所有条目。

当触发异常的字节码的索引值在某个异常表条目的监控范围内,Java 虚拟机会判断所抛出的异常和该条目想要捕获的异常是否匹配。

如果匹配,Java 虚拟机会将控制流转移至该条目 target 指针指向的字节码。

我们看 ,是第四个索引指向的字节码出了问题,显然,此时应该匹配红线这一条记录,从而跳转到第14个索引的字节码。


我们看他怎么做的?


new出一个RuntimeException并抛出,它就是


这一句,按照我们刚才的流程,此时依然需要找到这个RuntimeException在哪个异常表的条目中


此时匹配到异常表的条目,跳转到字节码索引23


继续抛出RuntimeExcpetion,可以注意到 这实际上对应了


这个语句,于是我们可以知道,在三个都出现异常的情况下,实际上最终向外抛出的异常是finally里面的异常。

可以看到当31索引处调用athrow语句抛出异常时,此时异常表没有任何一个条目能够匹配该异常,此时怎么办呢?


如果遍历完所有异常表条目,Java 虚拟机仍未匹配到异常处理器,那么它会弹出当前方法对应的 Java 栈帧,并且在调用者中重复上述操作。

在最坏情况下,Java 虚拟机需要遍历当前线程 Java 栈上所有方法的异常表。

事实上分析以上的整体的全部语句你可以发现,jvm层面有真正的finally吗?

没有

现在的做法是,复制 finally 代码块的内容,分别放在 try-catch 代码块所有正常执行路径以及异常执行路径的出口中。无论是否出现异常,确保一定会执行finally语句。

刚才catch出了异常,依然执行finally语句就可以发现这一点。至于其他路径,大家可以自行验证。我就在这里抛砖引玉了。

至于为什么2-6发生任何异常都跳转到23?大家可以自己想一下这个问题。

我就提示一点 2-6 target为14的条目代表的catch是不能捕获所有异常的,但是你要确保finally的语句能够执行。而2-6恰巧是try语句块的内容。23这个索引恰巧是finally语句的一份复制。

END

个人公众号:石杉的架构笔记(ID:shishan100)

欢迎长按下图关注公众号:石杉的架构笔记!

公众号后台回复资料,获取作者独家秘制学习资料

石杉的架构笔记,BAT架构经验倾囊相授



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/6753.html

相关文章

  • 阿里小哥带你玩转JVM揭秘try-catch-finallyJVM底层都干些啥

    摘要:当触发异常的字节码的索引值在某个异常表条目的监控范围内,虚拟机会判断所抛出的异常和该条目想要捕获的异常是否匹配。 作者:李瑞杰目前就职于阿里巴巴,狂热JVM爱好者让我们准备一个函数:showImg(https://user-gold-cdn.xitu.io/2019/5/19/16acbce35adfefb7);然后,反编译他的字节码:showImg(https://user-gold-cd...

    番茄西红柿 评论0 收藏0
  • 阿里小哥带你玩转JVM揭秘try-catch-finallyJVM底层都干些啥

    摘要:当触发异常的字节码的索引值在某个异常表条目的监控范围内,虚拟机会判断所抛出的异常和该条目想要捕获的异常是否匹配。 作者:李瑞杰目前就职于阿里巴巴,狂热JVM爱好者让我们准备一个函数:showImg(https://user-gold-cdn.xitu.io/2019/5/19/16acbce35adfefb7);然后,反编译他的字节码:showImg(https://user-gold-cd...

    番茄西红柿 评论0 收藏0
  • swoft| 源码解读系列二: 启动阶段, swoft 都干些啥?

    摘要:源码解读系列二启动阶段都干了些啥阅读框架源码了解启动阶段的那些事儿小伙伴刚接触的时候会感觉压力有点大更直观的说法是难开发组是不赞成难这个说法的的代码都是实现的而又是世界上最好的语言的代码阅读起来是很轻松的之后开发组会用系列源码解读文章深 date: 2018-8-01 14:22:17title: swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?descriptio...

    hqman 评论0 收藏0
  • 老司机【分享】带你玩转阿里云服务器

    摘要:阿里云是国内云服务器市场的龙头,性价比高,速度快又安全,是站长建站首选的云服务器之一。作为一个老司机,福利吧也和大家分享一下我的阿里云推广经验,教大家如何免费推广云大使。阿里云是国内云服务器市场的龙头,性价比高,速度快又安全,是站长建站首选的云服务器之一。福利吧使用的也是阿里云服务器,是折腾了很多次网站搬家后,才选择了阿里云。身边好几个站长最后都殊途同归,用了阿里云,可见阿里云服务器性能确实...

    banana_pi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<