/**
* java虚拟机规范
* 虚拟机结构
* @对象的表示
* java虚拟机不强制规定对象的内部结构应当如何表示
* 指向对象实例的引用是一个指向句柄的指针
* 这个句柄又包含两个指针,
* 其中一个指向一个表格——包含该对象的各个方法,和Class对象的指针,Class对象表示该对象的类型
* 另一个指针指向分配在堆中的对象实例数据
*
* @浮点算法
* IEEE的差异,缺乏基础知识。
*
* @特殊方法
* java编程语言的构造器是一个名<init>的特殊实例化方法。
* 实例化初始化方法只能在实例的初始化期间,通过java虚拟机的invokespecial指令调用
* 而且只能在尚未初始化的实例上调用该指令。
* 构造器访问权限也会约束由该构造器所衍生出来的实例初始化方法。
* @异常
* java虚拟机里面的异常使用Throwable 或子类的实例表示,
* 抛异常的本质实际上是程序控制权的一种即时的,非局部的转换。
* 从异常抛出的地方,转换到异常处理的地方。
* 当前线程执行操作发生的异常——同步异常,异步异常在程序执行的任意时间都有可能发生。
*
* @java虚拟机发生异常的三种原因
* 1、athrow字节指令执行
*
* 2、虚拟机同步检测到程序发生了非正常的执行情况,
* 这时异常必将紧接着发生非正常执行情况的字节码指令之后抛出,
* 而不会在执行过程中随时抛出
* @程序执行的操作可能会发生异常
* 当字节指令所蕴含的操作违反了java语言的语义。
* 访问一个超出数组边界范围的元素。
* 当程序在加载或者链接的时候出现错误。
* 链接失效,找不到加载目的项
* @使用某些资源的时候产生资源受到限制
* 使用了太多内存。
*
* 3、由于以下异常导致了异步异常的出现
* @调用了Thread或ThreadGroup的Stop方法
* @java虚拟机发生了内部错误
* 当某个线程调用stop方法,将会影响到其他线程,或者在特定线程组的内部所有线程。
* 这时候其它线程中出现的异常就是异步异常。
* 因为这些异常可能出现在线程执行过程中的任何位置。
* Java虚拟机允许在异步线程抛出异常之前额外执行一小段有限的代码。
* 使得代码优化器能够在不违反java语言语义的前提下检测并把这些异常在可处理它们的地方抛出。
*
* @抛出异常的动作在java虚拟机中有精确地定义,当异常抛出,程序控制权转移的那一刻,所有在异常抛出的位置之前
* 的字节码指令所产生的影响都是可以观察到的,而在异常抛出之后的位置之后的字节码指令,则不应当产生执行效果。
* 如果虚拟机执行的代码是优化后的代码,有一些在异常出现的位置之后的代码可能已经执行了,那这些优化后的代码
* 必须保证被它们提前执行所产生的影响对用户程序来说都是不可见的。
*
* @由java虚拟机执行的每个方法都会配有零至多个异常处理器
* 异常处理器描述了其在方法代码中的有效作用范围(通过字节码偏移量范围来描述),能处理的异常类型以及处理异常的代码所在位置
* 要判断某个异常处理器是否可以处理某个具体的异常,需要同时检查异常出现的位置是否在处理的有效范围内,以及出现的异常
* 是否是异常处理器声明的可以处理异常类型或者子类型。
* @当抛出异常,Java虚拟机搜索当前方法包含的各个异常处理器,
* 如果能找到可以处理异常的处理器则将代码控制权转移到异常处理器中描述的处理异常的分支之中
* @如果当前方法没有找到任何异常处理器,并且当前调用方法确实发生了异常——方法异常完成的情况
* 那当前操作数栈和局部变量表都将被丢弃,随后它对应的栈帧出栈,并恢复到该方法调用者的栈帧中
* 未被处理的异常将在方法调用者的栈帧中再次抛出,并在整个方法链中不断重复进行前面描述的过程
* 如果已经达到方法调用链的顶端,却还没有找到合适的异常处理器去处理这个异常,那整个执行线程都被终止
*
* @搜索异常处理器是的搜搜顺序是关键,在class文件,每个方法的异常处理器都存储在一个表中
* 在运行时,当有异常抛出之后,java虚拟机就按照class文件中的异常处理器表所描述的异常处理器的先后顺序进行搜索
*
* java虚拟机本身不会对方法的异常处理器表进行排序或者其它方式的强制处理,所以java语言中对异常处理的语义
* 实际上是通过编译器当安排异常处理器在表中的顺序来协助完成的,只有在class文件中定义明确的异常处理器超照顺序,
* 才能保证无论class文件是通过何种途径产生的,jvm执行时都有一致的行为表现
*
*
*/
java虚拟机规范——虚拟机结构——异常处理
最新推荐文章于 2024-10-06 20:16:20 发布