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

JVM内存模型 Java内存模型 Java内存模型是共享内存的并发模型,线程之间主要通过读-写共享变量(堆内存中的实例域,静态域和数组元素)来完成隐式通信。 Java 内存模型(JMM)控制 Java 线程之间的通信,决定一个线程对共享变量的写入何时对另一个线程可见。 计算机高速缓存和缓存一致性 计算机在高速的 CPU 和相对低速的存储设备之间使用高速缓存,作为内存和处理器之间的缓... 阅读详情

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 等语义

篇幅有限,资料已整理成文档,查看下方名片获取!

内存模型(Memory Model)是什么? 内存模型是定义多线程程序中内存访问行为的核心规则,主要解决两个问题:1)线程写操作对其他线程的可见性;2)内存操作的重排序限制。现代计算机因缓存一致性和指令重排序(编译器/CPU优化)导致并发访问复杂化,内存模型通过硬件层(如x86/ARM差异)和语言层(如Java/C++抽象)建立统一契约。关键概念包括内存序(顺序一致/获取-释放/松散),通过内存屏障和原子操作平衡性能与正确性,使多线程程序行为可预测。 阅读详情

相关推荐

一文读懂Memory consistency model (内存模型)

本文介绍了计算机系统中各种常见的memory model(内存模型)以及优缺点。

W1Z1Q的专栏 4647

JMM(Java内存模型)详解

1.什么是JMM? ​ JMM 是Java内存模型( Java Memory Model),简称JMM。它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范。通过这组规范,定义了程序中对各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。 ​ 计算机在执行程序时,每条指令都是在CPU中执行的。而执行指令的过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过

LYQ20010417的博客 3万+

JDK、JRE、JVM本质区别与工程实践指南

JDK、JRE、JVM是Java运行体系的三层核心抽象:JVM作为字节码执行引擎,是跨平台能力的技术根基;JRE为其提供标准类库与运行时支持,构成最小可执行环境;JDK则在JRE基础上集成编译器(javac)、调试器(jdb)、性能分析工具(jstat/jmap)等开发必需组件。这种分层设计源于责任分离——JVM专注指令执行,JRE保障程序运行,JDK支撑全生命周期开发。在云原生与容器化场景下,轻量级JRE(如openjdk:17-jre-headless)成为生产部署首选,而JDK仍是构建、调试与问题诊断

411

JMM概述

简介什么是JMM内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描述,不同架构下的物理机拥有不一样的内存模型,Java虚拟机是一个实现了跨平台的虚拟系统,因此它也有自己的内存模型,即Java内存模型(Java Memory Model, JMM)。因此它不是对物理内存的规范,而是在虚拟机基础上进行的规范从而实现平台一致性,以达到Java程序能够“一次编写,到处运行

牧竹子 6万+

别再搞混了!深入浅出理解Java线程中start()和run()的本质区别

run()它只是一个普通的方法。它定义了线程要执行的任务内容,就像一份“菜谱”。当你直接调用时,就相当于你(当前线程)亲自按照这份菜谱去做菜。这不会产生任何新的线程。start()它是一个神奇的启动命令。它的作用是为run()方法里的“菜谱”聘请一位专门的厨师(新线程)。JVM在收到start()指令后,会创建一个新的执行线程,并由这个新线程在后台自动去调用和执行run()方法。start()和run()的区别,是Java多线程编程的基石概念。run():是任务本身。它定义了“做什么”。start():是。

zhaostars的博客 607

Java面试核心:JVM内存管理与HashMap原理详解

JVM内存管理是Java性能优化的核心领域,涉及堆内存、方法区、虚拟机栈等关键区域的精细划分。通过分代收集算法和GC机制,JVM实现了高效的内存回收,而内存泄漏和OOM异常等问题则需要借助jmap、jstat等工具进行排查。HashMap作为Java集合框架的重要组成,采用数组+链表+红黑树的结构解决哈希冲突,其扩容机制和线程安全特性是面试高频考点。理解这些底层原理不仅能帮助开发者编写高性能代码,也是通过大厂Java技术面试的关键。本文结合JVM内存模型和HashMap实现细节,为读者揭示Java核心技术背

weixin_30565199的博客 408

JVM 内存模型详解

JVM 运行时数据区分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区),其中堆是 GC 核心区域;虚拟机栈易出(栈深度超限),堆易出(堆内存不足),元空间(JDK8+)也可能因类元数据过多溢出;理解内存模型的核心价值:能定位内存溢出 / 泄漏问题,优化 JVM 参数,提升程序稳定性。

2502_92141759的博客 974

Java数组声明:从基础语法到内存模型与性能优化的深度解析

数组作为计算机科学中最基础的数据结构之一,本质上是连续内存空间的抽象,用于存储相同类型的数据集合。其核心原理在于通过索引实现O(1)时间复杂度的随机访问,这种特性使其在性能敏感场景中具有不可替代的价值。在Java语言中,数组不仅是基本数据类型和对象的容器,更是理解JVM内存模型和引用机制的绝佳切入点。从技术价值看,掌握数组的声明、创建与初始化三阶段,能有效避免NullPointerException和ArrayIndexOutOfBoundsException等常见运行时异常,这是构建健壮Java应用的基石

weixin_30444111的博客 262

第1篇:一段旅程的开始——JVM内存模型简介

本文介绍了Java虚拟机(JVM)的内存模型(运行时数据区),分为线程私有和共享区域。私有区域包括程序计数器、Java虚拟机栈和本地方法栈,随线程生灭;共享区域包含堆和方法区,是GC主战场。堆存储对象实例,方法区保存类信息、常量等。JDK8后方法区改用元空间,避免OOM。理解这些区域对性能调优和问题排查至关重要。文章还概述了执行引擎的作用,并总结了各区域特性及常见异常。

2503_90542405的博客 827

Excel数据分析实例

Excel数据分析实例 Excel数据分析五步走: 明确目的——观察数据——数据清洗——数据分析——数据可视化 数据是从Kaggle上下载的,牛油果的案例 目的 数据分析都是为了企业业务做得更好,这次案例主要针对于牛油果的销售量进行分析。 数据 检查是否有缺失值、是否一致化、是否有脏数据 分析 1.不同区域不同季度的牛油果价格走势 从上图中可以看出,东北地区的价格一直较高,而中南地区一直较低 2.2015-2018四年不同城市的销售总和 3.四年间不同城市的销售排名(降序排序) 可视化 1.四年间销

m0_53033371的博客 4369

从SC7A20数据手册到代码:一步步搞定加速度值读取与换算(避坑指南)

本文详细解析了SC7A20三轴加速度传感器的数据手册,从寄存器配置到原始数据读取,再到加速度值的换算方法。通过代码示例和避坑指南,帮助开发者准确实现加速度值的读取与换算,适用于嵌入式开发和运动检测应用。

weixin_26878995的博客 588

【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署

JVM、JRE、JDK 是每个 Java 开发者绕不开的三个核心术语,但很多人在配置环境时仍然分不清"装哪个才对"。 本文从核心定义出发,用俄罗斯套娃式的层级关系图理清三者的嵌套逻辑(JDK ⊃ JRE ⊃ JVM),配合对比表格、代码示例和三种真实场景(终端用户/开发者/运维诊断),讲透"谁在何时用什么"。 同时纠正三个高频误区——为什么服务器不该装 JDK、为什么 JVM 不只跑 Java、为什么 JRE 不等于类库合集,帮你从"背概念"升级到"理解架构"。

超级苦力怕的博客 2545

ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计

本文详细介绍了ABAP 7.40+新语法中的VALUE和REDUCE操作符,如何高效处理复杂内表统计任务。通过实战案例展示,这些新语法能将代码量减少70%以上,显著提升开发效率和可读性,特别适合大数据量下的销售数据分析、分组统计等场景。

weixin_27219587的博客 207

别再混淆了!JavaScript与Java的10个本质区别(附常见面试题解析)

本文详细解析了JavaScript与Java的10个本质区别,包括基因差异、执行环境、类型系统、面向对象、并发模型等核心方面,并附有常见面试题解析。帮助开发者深入理解这两种语言的技术特点,提升面试表现和技术选型能力。

weixin_29011239的博客 341

避坑指南:vmdk转qcow2镜像时你可能会遇到的5个问题及解决方法

本文详细解析了将VMDK虚拟机镜像转换为QCOW2格式时可能遇到的五大核心问题,特别是启动失败的常见原因及解决方案。内容涵盖格式差异、预处理优化、转换命令详解,并针对根文件系统挂载失败、GRUB引导失败、网卡识别、性能异常等典型故障提供了具体排查与修复步骤,旨在帮助运维人员高效、可靠地完成镜像迁移。

websocket5live的博客 275

LED背光驱动电路解析:从MP3394芯片到液晶屏灯管控制

本文深入解析了以MP3394芯片为核心的LED背光驱动电路工作原理。从升压电路的能量转换到多路LED的均流控制,详细阐述了其作为液晶屏背光“大脑”的关键作用,并提供了黑屏、闪屏、亮度不均等常见故障的实战检修思路与排查方法。

agile9scrum的博客 826

Java核心技术解析:从JVM到开发实践

Java作为企业级开发的主流语言,其核心技术体系包含JVM、JDK工具链和丰富的类库框架。理解Java虚拟机(JVM)的内存模型和垃圾回收机制是性能优化的基础,而掌握泛型、枚举等语法特性则能提升代码质量。在实际开发中,Lombok等工具可以显著提高效率,但需要注意版本兼容性问题。Java集合框架的设计思想和高并发解决方案是面试常见考点,合理使用HashMap、ConcurrentHashMap等容器对系统性能至关重要。随着模块化系统和现代语法特性的引入,Java持续保持技术竞争力,适用于微服务、大数据等热门

weixin_28455801的博客 241

为什么传统CNN在视网膜分割中败给Mamba?从血管拓扑学揭秘Serp-Mamba的蛇形扫描黑科技

本文深入分析了传统CNN在视网膜血管分割任务中的局限性,特别是在处理高分辨率图像和复杂血管拓扑结构时。针对这些问题,文章重点介绍了Serp-Mamba模型的核心创新——蛇形交织自适应扫描(SIA)机制,该机制通过让扫描路径自适应地贴合血管曲率,并结合模糊驱动双重校准(ADDR)模块应对极端类别失衡,从而在视网膜血管分割任务上实现了性能的显著突破。

ss78901的博客 896

别再混淆了!JavaScript与Java的10个本质区别(前端开发者必备知识)

本文详细解析了JavaScript与Java的10个本质区别,特别针对前端开发者。从语言基因、类型系统、面向对象到并发模型,全面对比两种语言的核心差异,帮助开发者避免混淆并提升开发效率。重点探讨了JavaScript的动态类型、原型链和事件循环等特性,为Java背景的开发者提供实用转换指南。

weixin_42558257的博客 264

Apollo Planning决策规划算法代码详细解析 (1):Scenario选择

本文重点讲解Apollo代码中怎样配置Scenario以及选择当前Scenario,Scenario决策是Apollo规划算法的第一步,本文会对代码进行详细解析,也会梳理整个决策流程,码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: 规划器planer的种类; 规划器planer的主要函数及逻辑; 场景管理类ScenarioManager的运行机制; 场景注册方法; 场景决策流程,如何选择当前场景 详细的apollo决策规划代码分析 代码具体过程如下: 1、Scenar

自动驾驶Player的博客 1万+

sphincs+ Nist Round3文档中文译版(SPHINCS+ Submission to the NIST post-quantum project, v.3)

1. 引言 哈希基础签名方案最初是由Lamport [14]在1970年代后期作为一次性签名方案开发的,并由Merkle [16]扩展为多次签名方案。这些方案的安全性易于分析,并仅依赖于所使用的哈希函数的属性。然而,Merkle基于树的签名方案需要在密钥生成时就确定要进行签名的数量,且为了保持性能这个数字要小。最重要的是,该系统需要用户记住一个状态:这个状态包含一些信息以记住密钥已经进行了多少次签名。 在Lamport方案诞生后的40年里,产生了许多想法改进了哈希基础签名的性能、实用性和理论基础,最终XMS

dedanddwb的博客 395

谈谈JVM内存泄漏与内存溢出的区别

本文深入剖析了Java中的内存泄漏(Memory Leak)与内存溢出(Out Of Memory)的核心区别。内存泄漏指无用对象因被意外引用而无法被回收,导致内存逐渐耗尽;内存溢出则是内存不足无法分配新对象导致的程序崩溃。文章通过JVM内存模型图示、典型代码示例和对比表格,清晰展示了两者在定义、成因、表现和诊断方法上的差异。内存泄漏可能引发内存溢出,但溢出也可能是由其他原因导致。诊断内存泄漏需借助专业工具分析对象引用链,而内存溢出则可通过错误日志快速定位。

m0_66884848的博客 841

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java学习—— static 关键字的全场景用法、类变量与实例变量的本质区别

static是 Java 的静态修饰符将成员归属于类本身,而非某个实例对象,被 static 修饰的成员会在类加载时初始化,不依赖任何对象调用。static 可修饰4 种语法元素成员变量 →类变量(静态变量)成员方法 →静态方法(类方法)代码块 →静态代码块内部类 →静态内部类类变量(static 变量):被 static 修饰的成员变量,属于类,全类所有对象共享一份;实例变量(非 static 变量):无 static 修饰的成员变量,属于单个对象,每个对象独有一份。核心:static 修饰的成员。

2402_83462390的博客 508

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 这可能是全网Java学习路线最完整,最详细的版本了,没有之一
下一篇: JVM上数据处理语言的竞争:Kotlin, Scala 和 SPL
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值