别再混淆了!JVM内存模型和Java内存模型的本质区别

JVM 内存模型(JVM Memory Model)和 Java 内存模型(Java Memory Model, JMM)是 Java 开发中两个非常重要的概念,但这两个概念很容易被搞混,所以本文就来通俗易懂的讲讲二者的区别。

首先,我们先来看看各自的概念,以及其解决的问题。

1.JVM内存模型

  • 定位:JVM 在运行 Java 程序时对物理内存的具体划分和管理方式,用来保证 Java 程序正常执行的。

alt

  • 目的:定义 Java 程序在运行时如何分配、使用和回收内存。
  • 核心组成
    • 堆(Heap):存储对象实例(所有线程共享)。
    • 方法区(Method Area):存储类信息、常量等(JDK8 后由元空间实现)。
    • 虚拟机栈(VM Stack):存储方法的局部变量、操作数栈(每个线程私有)。
    • 本地方法栈(Native Method Stack):服务于 JVM 调用本地方法。
    • 程序计数器(Program Counter Register):记录线程当前执行的指令地址。
  • 关注点:内存的分配、垃圾回收(GC)、内存泄漏等问题。

JVM不划分内存区域行不行?

从理论上来讲可能是可行的,但从程序的运行效率、垃圾回收的效率等方面来讲不划分内存区域,所有的信息放到一起,其效率是非常慢的,是不能被允许的。

并且不划分区域可能会导致关键数据易被污染的问题,例如方法区存储的类元数据(如类结构、静态变量)需要长期存在且全局共享,若与临时变量混存,可能导致类信息被意外覆盖。例如,在热加载类时,新类元数据可能覆盖正在被其他线程使用的旧版本,引发不可预知的错误。

所以综合来看,JVM 必须按存储的数据类型划分为不同的数据区域,以提升程序的执行和垃圾回收的效率,并且可以减少程序在运行时的一些不必要的问题,这就是 JVM 内存模型所解决的问题。

2.Java内存模型

  • 定位:Java 语言规范(JLS)定义的多线程环境下内存访问的规则和约束的一种规范

alt

  • 目的:解决多线程并发时的内存可见性、原子性、有序性问题,确保线程间正确通信。
  • 核心概念
    • 主内存(Main Memory):所有线程共享的内存区域。
    • 工作内存(Working Memory):每个线程私有的内存副本(可能对应 CPU 寄存器或缓存)。
    • happens-before原则:定义操作之间的偏序关系,确保可见性。
    • 内存屏障(Memory Barriers):禁止指令重排序的机制。
  • 关注点:如何通过 synchronized、volatile 等关键字或并发工具类保证线程安全。
  • 示例场景:解决多线程下共享变量的不可见性(如使用 volatile 禁止指令重排序)。

PS:也就是说“Java 内存模型”主要是保证 Java 在多线程下正常运行的一种机制(或规定)。

小结

JVM内存模型Java内存模型(JMM)
范畴 JVM 实现层面的内存区域划分 多线程并发编程的内存访问规则
主要目标 内存分配、回收和管理 解决线程间的可见性、有序性和原子性问题
具体实现 堆、栈、方法区等物理内存划分 volatile、synchronized 等语义
#八股文##java#
Java面试精讲 文章被收录于专栏

Java常见面试题、场景题、企业真题精讲。

全部评论

相关推荐

04-08 20:43
门头沟学院 Java
不知道是不是KPI,面试官感觉一边面试还一边在忙一些东西,一直说我们就聊聊天吧,后面还问我什么时候可以实习,实习多久,还说了部门语言,办公地点之类的。不过我回答不上来的时候他也都说没事,换一个换一个,总之面试体验还是非常好的。1. Redis的数据结构及其应用场景2. MySQL一条查询语句执行过程3. MySQL索引类型4. 最左匹配原则相关5. SQL优化方法6. Java什么情况下会full gc(直接跟他说我JVM还没怎么学,他就说那就先不问这个)7. TCP三次握手四次挥手8. 处于CLOSE_WAIT状态下的连接数过多,资源占用过多的时候该怎么处理9. 项目中比较有挑战的事情,怎么解决的(Redis + Lua + 乐观锁 异步处理,解决超卖)10. 有没有去调研过其他方式,比如12306、支付宝他们怎么解决这个问题的(我只说了还有个分布式锁的方法,然后他说可以去阅读一些公司的技术文档来应用到自己的项目里面)11. 项目的用户量?(我直接就说并发量不是很高,最多几百,一般都是用Jmeter模拟更大并发量)12. 说一下乐观锁和悲观锁?它们的应用场景?13. 为什么项目选择RabbitMQ?RabbitMQ对比Kafka等产品手撕:堆排序(都在刷力扣,没练过这个,大一学的早忘了)团子的面试感觉和其他的不太一样,问一个问题就跳到另外一个去问了,没有追问什么的#牛客创作赏金赛##美团##美团一面##面经##美团求职进展汇总##美团暑期#
团团美美:团子似乎就是不追问,但是希望你能自己吧啦吧啦说一些延伸啥的,我和我同学感觉是这样的
点赞 评论 收藏
分享
评论
8
14
分享

创作者周榜

更多
牛客网
牛客企业服务