JVM-整体结构(1)

446 阅读3分钟

JVM-整体结构(1).png

名词解释

方法区

  1. 类型信息:类型的全限定名,父类的全限定名,类型标志(CLass、Interface),类的访问描述符(public、private、default、final、static
  2. 常量池:
  3. 字段信息:字段修饰符(public、private),字段类型,字段名称
  4. 类变量:
  5. 方法表:包含类所有方法,方法修饰符,返回值类型,方法名,方法参数,方法类型

存放对象的实例,在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

指令地址操作指令
0iconst_1
1istore_1
2iconst_2
3istore_2
4iload_1
5iload_2
6iadd
7istore_3
8return

操作数栈

  1. 操作数栈再方法执行过程中,根据字节码指令往栈中写入数据或提取数据即入栈(push)/出栈(pop)
  2. 栈中的任何一个元素都可以是Java任意类型
    • 32bit占用一个栈单位深度
    • 64bit占用两个栈单位深度
  3. 如果被调用的方法有返回值,那么其返回值也会被压入当前栈帧的操作数栈中

局部变量表

  1. 用于存放方法参数和方法内定义的局部变量,这些数据类型包括:基本数据类型、对象饮用、returnAddress类型
  2. 由于局部变量表是建立在县城栈上的,是线程的私有数据,因此不存在数据安全隐患
  3. 局部变量表所需的大小是再编译器确定的,再方法的运行期间无法更改 注意事项:
  4. doubleLong 占据两个Slot位置
  5. 方法嵌套时,嵌套的变量占据的Slot可被重用

执行引擎

  1. 将字节码指令翻译成机器指令(0、1)交由CPU进行运算
  2. 操作局部变量表和操作数栈

本地方法接口

它是为了融合不同的语言为java所用的产物,最初的设计也是为了融合C/C++

本地方法库

未找到资料,待补充。。