方法调用的四条指令:
1)invokevirtual
2)invokeinterface
3)invokespecial (指令用于调用一些需要特俗处理的实例方法,包括实例初始化方法、私有方法和父类方法);
4)invokestatic


Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor)来支持的。
1)方法级的同步时隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之中。
虚拟机可以从方法常量池中的方法表结构(method_info structure)中的ACC_SYNCHRONIZED访问标志是否被设置,如果设置了,执行线程将先持有管程,然后再执行方法,最后在方法完成时释放管程。
2)同步一段指令集序列通常是由Java语言中的synchronized块来表示的,Java 虚拟机的指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义。


Java 虚拟机通常基于操作数栈来进行算术运算(只有iicn指令例外,它直接对局部变量进行自增操作)


所有的invokespecial指令调用的方法都需要this作为第一个参数,保存在第一个局部变量之中。


如果编译器要调用某个方法,必须先产生这个方法描述符,描述符中包含了方法实际参数和返回类型。


无论方法调用指令的操作数,还是putfield,getfield指令的操作数都并非类实例中的地址偏移量。编译器会为这些字段生成符号引用,保存在运行时常量池之中。


编译器会使用tableswitch和lookupswitch指令生成switch语句的编译代码。
tableswitch指令用于表示switch结构中的case语句块,可以高效地从索引表中确定case语句块的分支偏移量。


catch语句块会使编译器在异常表中增加一个成员,即一个异常处理器。


没有任何调用指令可以调用到<clinit>,也仅有invokespecial可以调用<init>。


如果一个方法描述符是有效的,那么它对应的方法的参数列表总长度小于等于255.


参数this的传递,是由Java虚拟机实现在调用实例方法所使用的指令中实现的隐式传递。


接口中的所有字段都具有ACC_PUBLIC,ACC_STATIC和ACC_FINAL标记,也可能被设置ACC_SYNTHETIC标记。


栈映射帧,类型状态


格式检查本应独立于字节码验证,他们都是Class文件验证过程的一部分,但由于历史原因,格式检查与字节码验证曾经混淆在一起,因为它们两者都是完整性检查的一种形式。


Java 虚拟机实现会在文件的链接阶段对Class文件进行必要的校验。


数组类型没有外部的二进制表示;它们都是由Java虚拟机创建,而不是通过类加载器加载的。


类或接口的运行时包结构由包名及类或接口的定义类加载器来决定。


通常使用<N,Ld>来表示一个类或接口,这里的N表示类或接口的名称,Ld表示类或接口的定义类加载器。



Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐