JVM内存结构和JAVA内存模型

299 阅读2分钟

JVM内存结构

JVM内存模型

线程私有

  1. 程序计数器:用来存放字节码行号的指示器。通过改变计数器的值选取下一条需要执行的字节码方法。
  2. 虚拟机栈:java方法执行的内存模型;包含多个栈帧。执行一个方法产生一个栈帧。每个方法执行时都会创建一个栈桢来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息。每个方法从调用直结束就对于一个栈桢在虚拟机栈中的入栈和出栈过程。蓝色为当前栈帧的具体结构。

java虚拟机栈

3.本地方法栈:与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。

线程共享区域

  1. 堆:对象实例的分配区域。 GC管理的主要区域。
  2. 元空间:元空间主要是主要用于存储类的信息、常量池、方法数据、方法代码。JAVA8利用元空间来实现方法区代替了永久代。和永久代的主要区别是:元空间使用的是本地内存,不在虚拟机中,不会遇到永久代存在的内存溢出错误。

JAVA的内存模型

Java中的内存模型只是一种规范和定义,这种规范和定义主要涉及变量的访问方式。对于共享变量,线程不直接访问,而是将恭喜变量拷贝到自己的工作内存,通过对工作内存的读写访问共享变量。对于写操作,要刷新到主内存。这里会涉及到一些线程安全的操作(原子性,可见性)。


这很像组成原理中的存储系统和cpu设计,如下


java内存模型和硬件系统的关系是:

工作内存和JVM主内存中的数据都可能存在于寄存器,CPU缓存和主内存中。因此java内存模型只是一种抽像概念,一种规则。

参考博客:blog.csdn.net/javazejian/…