别再混淆了!JVM内存模型和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不划分5大内存区域行不行?
从理论上来讲可能是可行的,但从程序的运行效率、垃圾回收的效率等方面来讲不划分内存区域,所有的信息放到一起,其效率是非常慢的,是不能被允许的。
并且不划分区域可能会导致关键数据易被污染的问题,例如方法区存储的类元数据(如类结构、静态变量)需要长期存在且全局共享,若与临时变量混存,可能导致类信息被意外覆盖。例如,在热加载类时,新类元数据可能覆盖正在被其他线程使用的旧版本,引发不可预知的错误。
所以综合来看,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,其中包含的内容有:场景题、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列等模块。
别再混淆了!JVM内存模型和Java内存模型的本质区别的更多相关文章
- JVM内存结构、Java内存模型和Java对象模型
Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文要讨论的JVM内存结构.Java内存模型和Java对象模型 ...
- 标准事件模型和IE事件模型有哪些区别?请具体解释他们的差异。
通常,事件传送有三个阶段:事件捕获阶段,停留目标阶段,事件冒泡阶段. 1.阶段差异 DOM事件模型包含捕获阶段和冒泡阶段,DOM事件模型可使用e.stopPropagation()来阻止事件流:IE事 ...
- Css盒模型有哪几部分,标准盒模型和IE盒模型有哪些区别
首先介绍Css的盒模型也就是标准盒模型(BOX Model) 包含了 内容(content) 内边距(padding) 边框(border) 外边框(margin) 这是大家经常用到的,也是现在的标准 ...
- 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程
许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...
- 【JVM】JVM内存结构 VS Java内存模型 VS Java对象模型
原文:JVM内存结构 VS Java内存模型 VS Java对象模型 Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清 ...
- 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念
本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...
- [转帖]JVM内存结构 VS Java内存模型 VS Java对象模型
JVM内存结构 VS Java内存模型 VS Java对象模型 https://www.hollischuang.com/archives/2509 Java作为一种面向对象的,跨平台语言,其对象.内 ...
- Java内存模型和JVM内存管理
Java内存模型和JVM内存管理 一.Java内存模型: 1.主内存和工作内存(即是本地内存): Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取 ...
- 【Java】JMM内存模型和JVM内存结构
JMM内存模型和JVM内存结构 JAVA内存模型(Java Memory Model) Java内存模型,一般指的是JDK 5 开始使用的新的内存模型,主要由JSR-133: JavaTM Memor ...
- Java 内存模型和 JVM 内存结构真不是一回事
这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...
随机推荐
- 各版本jdk百度云下载,包括linux版和windows版
并不是越新的版本就一定越好,请先考虑jdk的版本是否跟你的开发环境有版本冲突问题. 2021-11-4更新 ps:从官网下载实在是太慢了!! 官网链接:https://www.oracle.com/j ...
- postgres
10.67 su - app docker pull postgres:12.15 docker run -d --name pgsql12 -p 5432:5432 -e "POSTG ...
- springboot拦截器过滤token,并返回结果及异常处理
package com.xxxx.interceptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sp ...
- ERROR: manifest for hyperledger/fabric-orderer:latest not found
In docker command # pull to local before using itdocker pull hyperledger/fabric-orderer:x86_64-1.0.0 ...
- [转]spring-framework-x.x.x.RELEASE-dist下载教程
原文链接: spring-framework-x.x.x.RELEASE-dist下载教程
- win7语言栏不见了,只显示搜狗输入法,不显示中文(简体)-美式键盘
参考百度经验: win7右下角输入法图标不见了[终极方法]
- 一个小的图文编辑软件 -- 采用winform开发
本人用winform开发了一款图文编辑软件,实现了图片.文字.图形混合排版; 可以对图元调整大小.设置角度.添加剪切区间等操作.本人以前也写过一款类似的软件<WinForm版图像编辑小程序> ...
- runoob-设计模式
https://www.runoob.com/design-pattern/design-pattern-tutorial.html 设计模式(Design pattern)代表了最佳的实践,通常被有 ...
- VulNyx - Mail 靶机
扫描靶机 发现22 和 80端口 访问80端口 发现id=1 和2 时都会有回显 dirsearch -u http://http://192.168.200.39 访问这个1 和 2的路径 发现竟然 ...
- manim边做边学--淡入淡出变换
今天介绍Manim中用于淡入淡出变换的3个动画类: FadeToColor:聚焦于对象颜色的平滑转换,通过渐变增强视觉效果 FadeTransform:实现不同对象之间的渐变替换,让元素转换更加连贯 ...