静态分派:静态方法
动态分配:重写和重载(为每一个类创建一个方法表,快速定位目标)
其一,子类方法表中包含父类方法表中的所有方法;
其二,子类方法在方法表中的索引值,与它所重写的父类方法的索引值相同。
在执行过程中,Java 虚拟机将获取调用者的实际类型,并在该实际类型的虚方法表中,根据索引值获得目标方法。
关联内联缓存()
首先JVM在编译的时候,每个方法都会附带一个异常表(异常表会声明会被抛出的异常,而不是可能抛出的异常,包括catch里面自定义的异常)。异常表中每一个条目代表一个异常发生器,异常发生器由 From指针,To指针,Target指针和应该捕获的异常类型构成。 其中From指针和To指针该异常处理器所监控的范围,例如在try{}里面。 而target指针则指向异常处理器的起始位置。例如catch代码块的起始位置。
如何捕获异常:有一个异常表(from, to, target,type)
JVM会在当前出现异常的方法中,查找异常表,是否有合适的处理者来处理。
如果当前方法异常表不为空,并且异常符合处理者的from和to节点,并且type也匹配,则JVM调用位于 target 指针指向的字节码来处理。
如果上一条未找到合理的处理者,则继续查找异常表中的剩余条目。
如果当前方法的异常表无法处理,则向上查找(弹栈处理)刚刚调用该方法的调用处,并重复上面的操作。
如果所有的栈帧被弹出,仍然没有处理,则抛给当前的Thread,Thread则会终止。
如果当前Thread为最后一个非守护线程,且未处理异常,则会导致JVM终止运行。