并发2--java内存模型&jvm内存结构&java对象模型

要更好的理解并发问题,需要理解三个概念

  • jvm内存结构
  • java内存模型
  • java对象模型

jvm内存结构

众所周知,java是运行在jvm虚拟机上,而虚拟机会将所管理的内存划分为若干个不同的数据区域,如图(图片网上拷的)
并发2--java内存模型&jvm内存结构&java对象模型

方法区

方法区在以前的版本也可以称之为永久代,主要用于存储已被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码等数据。

虚拟机栈

java虚拟机栈是线程私有,他的生命周期与线程相同。虚拟机展描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口灯信息。每一个方法从调用知道执行完成的过程,就对应着一个栈帧在虚拟机展中入栈到出栈的过程。

本地方法栈

本地方法栈与虚拟机栈的作用基本一样,不同的是虚拟机为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务。

程序计数器

程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的刚好指示器。由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。

java堆

是虚拟机中内存最大的一块。堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存在对象实例,几乎所有的对象实例都在这里分配内存。

java内存模型

java内存模型是根据英文java memory model 翻译而来,简称JMM内存模型,jmm内存模型并不像jvm内存结构一样真实存在,它只是一个抽象概念。JMM是和多线程相关,它描述了一组规则或者叫规范,这个规范定义了多线程与内存之间的交互方式。
java的多线程是通过共享变量进行通信,在通信过程中会产生一系列如原子性、可见性、有序性的问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。

并发2--java内存模型&jvm内存结构&java对象模型

java对象模型
java对象在JVM的存储是有一定结构的,这个结构称之为java对象模型。

java对象在jvm中是以oop-klass模型存在的。oop(instanceOopDesc)包含对象的对象头和实例数据,而klass则表示这个对象的class,多个oop可以指向同一个klass(instanceKlass)。
并发2--java内存模型&jvm内存结构&java对象模型

总结

我们再来区分下JVM内存结构、 Java内存模型 以及 Java对象模型 三个概念。JVM内存结构,和Java虚拟机的运行时区域有关。 Java内存模型,和Java的并发编程有关。 Java对象模型,和Java对象在虚拟机中的表现形式有关。