网站首页 > java教程 正文
JVM 内存模型(JVM Memory Model)和 Java 内存模型(Java Memory Model, JMM)是 Java 开发中两个非常重要的概念,但这两个概念很容易被搞混,所以本文就来通俗易懂的讲讲二者的区别。
首先,我们先来看看各自的概念,以及其解决的问题。
1.JVM内存模型
- 定位:JVM 在运行 Java 程序时对物理内存的具体划分和管理方式,用来保证 Java 程序正常执行的。
- 目的:定义 Java 程序在运行时如何分配、使用和回收内存。
- 核心组成:
- 堆(Heap):存储对象实例(所有线程共享)。
- 方法区(Method Area):存储类信息、常量等(JDK8 后由元空间实现)。
- 虚拟机栈(VM Stack):存储方法的局部变量、操作数栈(每个线程私有)。
- 本地方法栈(Native Method Stack):服务于 JVM 调用本地方法。
- 程序计数器(Program Counter Register):记录线程当前执行的指令地址。
- 关注点:内存的分配、垃圾回收(GC)、内存泄漏等问题。
JVM不划分内存区域行不行?
从理论上来讲可能是可行的,但从程序的运行效率、垃圾回收的效率等方面来讲不划分内存区域,所有的信息放到一起,其效率是非常慢的,是不能被允许的。
并且不划分区域可能会导致关键数据易被污染的问题,例如方法区存储的类元数据(如类结构、静态变量)需要长期存在且全局共享,若与临时变量混存,可能导致类信息被意外覆盖。例如,在热加载类时,新类元数据可能覆盖正在被其他线程使用的旧版本,引发不可预知的错误。
所以综合来看,JVM 必须按存储的数据类型划分为不同的数据区域,以提升程序的执行和垃圾回收的效率,并且可以减少程序在运行时的一些不必要的问题,这就是 JVM 内存模型所解决的问题。
2.Java内存模型
- 定位:Java 语言规范(JLS)定义的多线程环境下内存访问的规则和约束的一种规范。
- 目的:解决多线程并发时的内存可见性、原子性、有序性问题,确保线程间正确通信。
- 核心概念:
- 主内存(Main Memory):所有线程共享的内存区域。
- 工作内存(Working Memory):每个线程私有的内存副本(可能对应 CPU 寄存器或缓存)。
- happens-before原则:定义操作之间的偏序关系,确保可见性。
- 内存屏障(Memory Barriers):禁止指令重排序的机制。
- 关注点:如何通过 synchronized、volatile 等关键字或并发工具类保证线程安全。
- 示例场景:解决多线程下共享变量的不可见性(如使用 volatile 禁止指令重排序)。
PS:也就是说“Java 内存模型”主要是保证 Java 在多线程下正常运行的一种机制(或规定)。
小结
JVM内存模型 | Java内存模型(JMM) | |
范畴 | JVM 实现层面的内存区域划分 | 多线程并发编程的内存访问规则 |
主要目标 | 内存分配、回收和管理 | 解决线程间的可见性、有序性和原子性问题 |
具体实现 | 堆、栈、方法区等物理内存划分 | volatile、synchronized 等语义 |
本文已收录到我的面试小站 [www.javacn.site](https://www.javacn.site),其中包含的内容有:场景题、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列等模块。
- 上一篇: 【C语言】(13)堆和栈
- 下一篇: 看完这篇,还不懂JAVA内存模型(JMM)算我输
猜你喜欢
- 2025-08-03 JVM内存结构和Java内存模型
- 2025-08-03 C++ 知识小结
- 2025-08-03 Java内存模型(JMM)详解
- 2025-08-03 为什么计算机内存需要堆和栈?
- 2025-08-03 Java中,对象一定在堆中分配吗?
- 2025-08-03 看完这篇,还不懂JAVA内存模型(JMM)算我输
- 2025-08-03 【C语言】(13)堆和栈
- 2025-08-03 达内java培训专家:如何理解Java堆栈?
- 2025-08-03 C++/C入门之堆和栈
- 2025-08-03 还有多少人搞不懂堆内存和栈内存的区别?
你 发表评论:
欢迎- 08-03JVM内存结构和Java内存模型
- 08-03C++ 知识小结
- 08-03Java内存模型(JMM)详解
- 08-03为什么计算机内存需要堆和栈?
- 08-03Java中,对象一定在堆中分配吗?
- 08-03看完这篇,还不懂JAVA内存模型(JMM)算我输
- 08-03别再混淆了!JVM内存模型和Java内存模型的本质区别
- 08-03【C语言】(13)堆和栈
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)