JMM(JVM内存模型)

Java通过多线程机制实现多任务并行处理。

所有线程共享JVM内存(main memory),同时线程又有自己的工作内存。

当线程与主存进行交互时,数据从主存复制到工作内存中,由线程进行处理。

JVM的逻辑内存模型中,包含如下几个部分:
1)程序计数器
2)虚拟机栈
3)本地方法栈
4)Java堆
5)方法区

一、程序计数器

程序计数器是一块较小的内存空间。它可以被理解为是当前正在执行的字节码指令的指示器。字节码解释器就是通过程序计数器来选取下一条要执行的字节码指令。程序的分支、跳转、循环、线程切换都依赖程序计数器。

Java是多线程的,但是在任一时刻,一个处理器内核只能执行一个线程中的指令。因此,为了线程切换后能够恢复到正常的位置继续执行,需要为每一个线程配备一个独立的程序计数器。

注意,程序计数器是JVM中唯一不会抛出OutOfMemoryError的内存区域。

二、虚拟机栈

与程序计数器一样,虚拟机栈也是线程私有的。虚拟机栈体现了Java方法执行的内存模型。每个方法执行前都会创建一个栈帧,用于存放局部变量表等信息。方法的调用到执行完毕的过程,就对应了一个栈帧从入栈到出栈的过程。

局部变量表所需的内存大小在编译期确定,在方法运行期间不会改变局部变量表的大小。

注意,当线程请求的栈深度超过虚拟机允许的最大栈深度时,会抛出StackOverflowError。如果栈深度可以动态扩展,当无法申请到足够的内存空间时,会抛出OutOfMemoryError。

三、本地方法栈

本地方法栈和虚拟机栈的功能是非常相似的,不同的是,本地方法栈是为native方法调用服务的。同时,本地方法栈也会抛出StackOverflowError和OutOfMemoryError。

四、Java堆

Java堆在虚拟机启动时创建,是被所有线程共享的一块内存。它的作用是存放对象实例。Java堆也是垃圾回收器管理的主要区域。注意,当没有内存可以创建对象实例,并且堆也无法再扩展时,会抛出OutOfMemoryError。

五、方法区

方法区用于存放类信息、静态变量、常量等数据。当方法区无法满足内存需求时,也会抛出OutOfMemoryError。

### JMMJVM 内存模型的区别与联系 #### 定义与作用范围 Java内存模型 (JMM) 是一种抽象的概念框架,用于描述多线程环境下程序的行为以及如何处理共享变量的一致性和可见性问题[^3]。而 Java 虚拟机(JVM) 的内存结构则是指运行时数据区的具体划分方式,比如堆、栈、方法区等物理存储区域。 #### 关键特性对比 ##### 可见性 JMM 提供了一套机制来保证不同线程之间操作的可见性。例如,在新版本中对于 `final` 字段的操作被赋予特殊待遇,一旦对象构建完成并初始化其所有的 final 域,则这些域的内容将立即对其他任何读取该对象引用的线程变得可见[^1]。 ##### 原子性 虽然两者都涉及到原子性的概念,但是它们关注的角度有所不同。JMM 主要是针对复合动作(如先写后读),确保某些特定类型的指令不会被拆分;相比之下,JVM 更多地是从硬件层面考虑单条机器码级别的不可分割执行[^4]。 ##### 有序性 由于现代处理器普遍支持乱序执行优化技术,因此即使源代码中的顺序固定不变,实际编译后的二进制文件也可能存在指令重排现象。为此,JMM 设定了 Happens-Before 规则集用来约束这种行为,从而维持逻辑上的因果关系链路。然而,具体到每种 CPU 架构上实现上述规则的方式会有所差异,这就属于 JVM 实现细节的一部分了。 ```java // 示例:展示 volatile 如何影响可见性和有序性 public class VolatileExample { private static volatile boolean flag = false; public void writer() { flag = true; } public void reader() { while (!flag) {} System.out.println("Flag has been set"); } } ``` #### 协作关系 实际上,JMM 并不是独立存在的实体,而是作为指导原则嵌入到了各个具体的 JVM 版本当中去实施。当开发者编写遵循 JMM 规范的应用程序时,底层的 JVM 就负责将其转换成适合目标平台特性的有效形式,同时还要满足由前者所设定的各种同步需求和性能期望值[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值