名词解释
方法区
- 类型信息:类型的全限定名,父类的全限定名,类型标志(
CLass、Interface),类的访问描述符(public、private、default、final、static)- 常量池:
- 字段信息:字段修饰符(
public、private),字段类型,字段名称- 类变量:
- 方法表:包含类所有方法,方法修饰符,返回值类型,方法名,方法参数,方法类型
堆
存放对象的实例,在
jdk1.7后常量池也放到堆中,堆是GC的主要回收区域
java栈
虚拟机栈也是线程私有内存,每个方法对应着虚拟机栈中的一个栈帧,方法调用对应着一个栈帧的入栈,方法执行结束对应着一个栈帧的出栈。
本地方法栈
它与java虚拟机栈的作用是相似的,只不过存储native方法区域的地址。
程序计数器
概述
程序计数器(PC寄存器)用来存储指向下一条指令的地址,由执行引擎读取执行。使用程序计数器的好处是因为CPU在运行时会不断的切换线程,在切换回来的时候得需要知道在哪一条指令开始执行,程序计数器是线程私有的,每一个线程都有自己的程序计数器
示例
代码
public static void main(String[] args) {
int i = 1;
int j = 2;
int z = i + j;
}
字节码文件
stack=2, locals=4, args_size=1
| 指令地址 | 操作指令 |
|---|---|
| 0 | iconst_1 |
| 1 | istore_1 |
| 2 | iconst_2 |
| 3 | istore_2 |
| 4 | iload_1 |
| 5 | iload_2 |
| 6 | iadd |
| 7 | istore_3 |
| 8 | return |
操作数栈
- 操作数栈再方法执行过程中,根据字节码指令往栈中写入数据或提取数据即入栈(push)/出栈(pop)
- 栈中的任何一个元素都可以是Java任意类型
32bit占用一个栈单位深度64bit占用两个栈单位深度
- 如果被调用的方法有返回值,那么其返回值也会被压入当前栈帧的操作数栈中
局部变量表
- 用于存放方法参数和方法内定义的局部变量,这些数据类型包括:基本数据类型、对象饮用、returnAddress类型
- 由于局部变量表是建立在县城栈上的,是线程的私有数据,因此不存在数据安全隐患
- 局部变量表所需的大小是再编译器确定的,再方法的运行期间无法更改 注意事项:
double和Long占据两个Slot位置- 方法嵌套时,嵌套的变量占据的
Slot可被重用
执行引擎
- 将字节码指令翻译成机器指令(0、1)交由CPU进行运算
- 操作局部变量表和操作数栈
本地方法接口
它是为了融合不同的语言为java所用的产物,最初的设计也是为了融合C/C++
本地方法库
未找到资料,待补充。。