本文内容大部分是复制粘贴的,自己做参考用,每个章节已注明内容来源
jvm结构
参考 这一篇。
栈帧(Frame)
每次方法调用都会新建一个新的栈帧并把它压栈到栈顶。当方法正常返回或者调用过程中抛出未捕获的异常时,栈帧将出栈。更多关于异常处理的细节,可以参考下面的异常信息表章节。
每个栈帧包含:
- 局部变量数组
- 返回值
- 操作数栈
- 类当前方法的运行时常量池引用
局部变量数组
局部变量数组包含了方法执行过程中的所有变量,包括 this 引用、所有方法参数、其他局部变量。对于类方法(也就是静态方法),方法参数从下标 0 开始,对于对象方法,位置0保留为 this。有下面这些局部变量:
- boolean
- byte
- char
- long
- short
- int
- float
- double
- reference
- returnAddress
除了 long 和 double 类型以外,所有的变量类型都占用局部变量数组的一个位置。long 和 double 需要占用局部变量数组两个连续的位置,因为它们是 64 位双精度,其它类型都是 32 位单精度。
字节码
字节码1
字节码2