JVM内存模型

JVM的内存模型分为五个区域

PC寄存器

由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令。为了使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,用以记录当前执行到的指令。

Java栈

Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,栈帧中存放了:

  1. 局部变量表
  2. 操作数栈
  3. 指向运行时常量池的引用
  4. 方法返回地址
  5. 一些额外的附加信息。

Java栈是线程私有的,当线程执行一个方法时,就会创建一个栈帧并压栈;当方法执行完毕之后,便会将栈帧出栈。

本地方法栈

本地方法栈与Java栈的作用和原理非常相似,区别在于Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法服务的。

Java堆

Java堆是用来存储对象和数组。堆是被所有线程共享的,在JVM中只有一个堆。

方法区

方法区是被所有线程共享的,它存放了:

  1. 每个类的信息(包括类的名称、方法信息、字段信息)
  2. 静态变量
  3. 运行时常量池(包括class文件中的常量池和运行时产生的常量)
    • class文件中的常量池包含了字面量和符号引用。字面量相当于Java语言的常量,如文本字符串,声明为final的常量等。符号引用包括类和接口的全限定名、字段名称和描述符、方法名称和描述符。
  4. 编译器编译后的代码

JMM(Java内存模型)

JMM规定了所有的变量都存储在主内存(Main Memory)中。每个线程还有自己的工作内存(Working Memory),线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程之间值的传递都需要通过主内存来完成。主内存包括Java堆、方法区;线程的工作内存包括Java栈、本地方法栈、PC寄存器。

0%