JVM 内存模型(JVM Memory Model)和 Java 内存模型(Java Memory Model, JMM)是 Java 开发中两个非常重要的概念,但这两个概念很容易被搞混,所以本文就来通俗易懂的讲讲二者的区别。
首先,我们先来看看各自的概念,以及其解决的问题。
从理论上来讲可能是可行的,但从程序的运行效率、垃圾回收的效率等方面来讲不划分内存区域,所有的信息放到一起,其效率是非常慢的,是不能被允许的。
并且不划分区域可能会导致关键数据易被污染的问题,例如方法区存储的类元数据(如类结构、静态变量)需要长期存在且全局共享,若与临时变量混存,可能导致类信息被意外覆盖。例如,在热加载类时,新类元数据可能覆盖正在被其他线程使用的旧版本,引发不可预知的错误。
所以综合来看,JVM 必须按存储的数据类型划分为不同的数据区域,以提升程序的执行和垃圾回收的效率,并且可以减少程序在运行时的一些不必要的问题,这就是 JVM 内存模型所解决的问题。
PS:也就是说“Java 内存模型”主要是保证 Java 在多线程下正常运行的一种机制(或规定)。
JVM内存模型 | Java内存模型(JMM) | |
---|---|---|
范畴 | JVM 实现层面的内存区域划分 | 多线程并发编程的内存访问规则 |
主要目标 | 内存分配、回收和管理 | 解决线程间的可见性、有序性和原子性问题 |
具体实现 | 堆、栈、方法区等物理内存划分 | volatile、synchronized 等语义 |