论坛首页 Java企业应用论坛

译JVMS3 §2.10 Exception

浏览 5418 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-11   最后修改:2011-05-11
  打算在《Java虚拟机规范(第三版)》出来的时候,把这个规范全文翻译一次,做个open-document,想提升一下自己的E文水平,也希望对想读JVMS但E文不好的同学有所帮助。翻译期间把一些独立的内容在JE中放出来,供有兴趣的朋友预览指正,也督促自己不要偷懒。现在的进度是翻译了第1、2章,大约40页,3万字,刚刚开始译第6章。
  JVM Specification第三版(final draft)中关于异常的规定(§2.10)与第二版(§3.10)相比有较大变动,下面是第三版《§2.10 Exception》的译文。


  Java虚拟机里面的异常使用Throwable或其子类的实例来表示,抛异常的本质实际上是程序控制权的一种即时的、非局部(Nonlocal)的转换——从异常抛出的地方转换至处理异常的地方。
  绝大多数的异常的产生都是由于当前线程执行的某个操作所导致的,这种可以称为是同步的异常。与之相对的,异步的异常是指在程序的其他任意地方进行的动作而导致的异常。Java虚拟机中异常的出现总是由下面三种原因之一导致的:
  1. 虚拟机同步检测到程序发生了非正常的执行情况,这时异常将会紧接着在发生非正常执行情况的字节码指令之后抛出。例如:
    ■ 字节码指令所蕴含的操作违反了Java语言的语义,如范围一个超出数组边界范围的元素。
    ■ 类在加载或者连接时出现错误。
    ■ 使用某些资源的时候产生资源限制,例如使用了太多的内存。
  2. athrow字节码指令被执行。
  3. 由于以下原因,导致了异步的异常出现:
    ■ 调用了Thread或者ThreadGroup的stop方法。
    ■ Java虚拟机实现的内部程序错误。
  当某个线程调用了stop方法时,将会影响到其他的线程,或者在线程组中的所有线程。这时候其他线程中出现的异常就是异步异常,因为这些异常可能出现在程序执行过程的任何位置。虚拟机的内部异常也被认为是一种异步异常(§6.3)
  Java虚拟机规范允许在异步异常被抛出时额外执行一小段有限的代码,允许代码优化器在不违反Java语言语义的前提下检测并把这些异常在可处理它们的地方抛出(注1)。
  抛出异常的动作在Java虚拟机之中是一种被精确定义的程序控制权转移过程,当异常抛出、程序控制权发生转移的那一刻,所有在异常抛出的位置之前的字节码指令所产生的影响 都应当是可以被观察到的,而在异常抛出的位置之后的字节码指令,则应当是没有被执行过的。如果虚拟机执行的代码是被优化后的代码 ,有一些在异常出现位置之后的代码可能已经被执行了,那这些优化过的代码必须保证被它们提前执行所产生的影响对用户程序来说都是不可见的。
  由Java虚拟机执行的每一个方法都会配有零至多个异常处理器(Exception Handlers),异常处理器描述了其在方法代码中的有效作用范围(通过字节码偏移量范围来描述)、能处理的异常类型以及处理异常的代码所在的位置。要判断某个异常处理器是否可以处理某个具体的异常,需要同时检查异常出现的位置是否在异常处理的有效作用范围内并且出现的异常是否异常处理器声明可以处理的异常类型或其子类型两个条件。当有异常被抛出时,Java虚拟机搜索当前方法的包含的各个异常处理器,如果能找到可以处理该异常的异常处理器,则将代码控制权转向到异常处理器中描述的处理异常的分支之中。
  搜索异常处理器时的搜索顺序是很关键的,在Class文件里面,每个方法的异常处理器都存储在一个表中(§4.7.3)。在运行时,当有异常出现之后,Java虚拟机就按照Class文件中的异常处理器表描述异常处理器的先后顺序,从前至后进行搜索。
  需要注意,Java虚拟机本身不会方法的对异常处理器表做排序或者其他方式的强制处理,所以Java语言中对异常处理的语义,实际上是通过编译器适当安排异常处理器在表中的顺序来协助完成的。在Class文件中定义了明确的异常处理器查找顺序,才能保证无论Class文件是通过何种途径产生的,Java虚拟机执行时都能有一致的行为表现。

  * 注1:对于简单的Java虚拟机实现,可以把异步异常简单地放在程序控制权转移指令上处理。因为如果不考虑跳转指令,那程序执行终归是有限的,所以执行一段时间后总会遇到控制权转移的指令,同理,异步异常抛出的延迟时间也是有限的。对于代码优化来说,如果能保证在控制权转移指令之间的代码没有异步异常抛出,那代码生成器就可以有相当的灵活性进行指令重排序优化来获取更好的性能。相关的资料推荐进一步阅读论文:《Polling Efficiently on Stock Hardware》,Marc Feeley,Proc.1993,《Conference on Functional Programming and Computer Architecture》,Copenhagen,Den-mark, 第179–187页。
   发表时间:2011-05-11  
期待ing,e文看得实在太痛苦
,你的书霎时后开卖?
0 请登录后投票
   发表时间:2011-05-11  
嗯,这个月底,就快了。
0 请登录后投票
   发表时间:2011-05-11  
看了这篇文章、感觉异常这块听让人难理解的、我还得好好琢磨琢磨、很期待你的作品、对我来说是以一种指导、毕竟软件这个东西、是需要有一个方向的、
0 请登录后投票
   发表时间:2011-05-11  
第三版地址在哪?
0 请登录后投票
   发表时间:2011-05-12  
IcyFenix 写道
嗯,这个月底,就快了。

je上的人有没有优惠呀
0 请登录后投票
   发表时间:2011-05-12  
java虚拟机规范第一版记得是有中文版的

java虚拟机规范第二版在 深入java虚拟机 第二版中有了大部分介绍

java虚拟机第三版目前还没见到?
0 请登录后投票
   发表时间:2011-05-12  
刚好我英文不行
0 请登录后投票
   发表时间:2011-05-12  
这个要顶啊,支持到底!
0 请登录后投票
   发表时间:2011-05-12  
楼主关于JVM的帖子很好啊,希望以后能弄个连载!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics