JVM学习笔记5

42 阅读2分钟

属性表集合

class文件,字段表,方法表都可以携带自己的属性表集合。

下面只介绍一部分常用的。

Code属性表(方法表中使用)

存放字节码

code属性表中包含一个名称为exception_table的属性,应与exceptions属性表区分。

Exceptions属性表 (方法表中使用)

列出方法中可能抛出的受查异常(checked exceptions)

字节码指令简介

Java虚拟机的指令由操作码(一个字节)和操作数构成。

大部分指令都不含操作数,只有一个操作码。

并非每种数据类型和每一种操作都有对应的指令。(操作码只有一个字节)

大部分指令不支持byte, char, short。没有任何指令支持boolean类型。

对这些类型的操作都是转换为int类型来处理的。

处理整型数据时,只有除法指令和求余指令中出现除数为零时会导致虚拟机抛出运行时异常。

在类型转换时可能导致结果与输入值有不同的正负号,因为原来符号位处于数值的最高位,高位被丢弃后,符号就取决与被丢弃后的数据的最高位了。

显示抛出异常的操作(throw语句)都是由athrow指令来实现的,处理异常(catch语句)不是由字节码指令来实现的,而是采用异常表来完成的。

Java虚拟机支持方法级的同步和方法内部一段指令序列的同步,他们都是使用管程(monitor,或者称为锁)来实现的。

方法级的同步是隐式的。同步一段指令集序列通常用java语言中的synchronized语句块来表示的, jvm中由指令monitorenter和monitorexit来实现的。