1、理解jvm与jmm



文章目录

  • 1、理解jvm与jmm
  • 1.Java虚拟机(jvm)
  • 1.1 jvm内存模型
  • 2.java内存模型(jmm)
  • 2.1 java内存模型(jmm)
  • 3.jvm和jmm的关系


1.Java虚拟机(jvm)

百度百科中解释:JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

个人理解,jvm是java运行期间划分的一个逻辑分区,在java中,只有java在加载运行期间,jvm才会被调用。

1.1 jvm内存模型

jvm进程与Java程序进程的关系 jvm与jmm_并发

程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。

Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。

本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。

heap Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。

方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。

运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。


2.java内存模型(jmm)

jmm是jvm规范,定义的一种抽象的内存模型,并不真实存在,但是逻辑上是成立的。目的是屏蔽Java在不同硬件或者操作系统对内存的访问的差异。

2.1 java内存模型(jmm)

如图,当多个线程同时操作共享数据时,主内存数据和各个线程中的副本数据可能就会出现不一致的问题。在并发编程中,java如何将主内存和多线程的数据保持一致是很关键的。埋下一个种子,等待后续发芽。

jvm进程与Java程序进程的关系 jvm与jmm_jmm_02

3.jvm和jmm的关系

java内存模型jmm是jvm规范,定义的一种抽象的内存模型。划分的抽象逻辑区域和jvm的内存模型区域是可以一一对应上的,如 jvm中 堆和方法区 中共享数据与都jmm主内存共享数据一致。

扩展:java内存模型中的多线程如何保证原子性、有序性、可见性。