jvm内存模型和java内存模型

article/2025/10/5 16:44:00

初识java虚拟机,就碰到一系列不懂的问题。我们以前常说java把局部变量放在栈里,new出来的变量放在堆里,然后堆里的数据不定时就给回收了。然后,如果是多线程的话,每个线程自己都有会一个私有的虚拟机栈,运行每个方法时都会创建一个栈帧,栈帧里存储着局部变量啦等信息,方法结束栈帧就出栈。这好像就是我们对java内存模型的第一次理解吧。直至今天,我看了java线程通讯之java内存模型,出现了主内存、工作内存等相关的字眼,说什么工作内存从主内存拷贝一份共享变量做高速缓存,每个线程拥有一个工作内存,这什么内存模型,又解决了什么问题呢。甚是不解,搜索了半天。原来一开始我们就搞混乱了。我们之前说的栈堆那个是JVM内存模型啊。

区别:JVM内存模型则是指JVM的内存分区,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。

我们可以看到,Java堆和方法区的区域是多个线程共享的数据区域。也就是说,多个线程可以操作保存在堆或者方法区中的同一个数据。这也就是我们常说的“Java的线程间通过共享内存进行通信”。那么java虚拟机从底层就怎么操作的呢。

JMM并不像JVM内存结构一样是真实存在的,只是一个抽象的概念。JMM是和多线程相关的,描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。简单总结下,Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。所以,我理解的就是JMM就是为了解决Java多线程对共享数据的读写一致性问题而产生的一种模型!

下图是反映了主内存与线程工作内存(即是本地内存)之间的关系:

JMM的主要目标是实现在JVM中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与Java编程里面的变量有所不同步,它包含了实例字段、静态字段和构成数组对象的元素,但不包含局部变量和方法参数,因为后者是线程私有的,不会共享,当然不存在数据竞争问题。所以,我理解的是上图中的共享变量只是堆中的部分变量。而JMM规定了所有的变量都存储在主内存中,这个变量我想都是堆变量,如果硬是要跟JVM做一下匹配,那么我想主内存就相当于堆内存和方法区。然后线程copy的共享变量只是对部分堆变量的copy。那么,可想而知,如果硬是要匹配,我想工作内存里是包含两部分:线程私有的栈(这里不共享,也就没啥事),对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓冲区)。

看张图就清晰了,

每个线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成。

分析上图:

1.线程A把从工作内存更新过的共享变量刷新到主内存中去。

2.线程B到主内存中去读取线程A刷新过的共享变量,然后copy一份到自己的工作内存里去。

虽然是这样,并没有解决并发问题啊,不可见?不具备原子性。这时候JMM定义了一些语法集,就是volatile、synchronized啦。

例如可见性吧,一个线程对共享变量做了修改之后,其他的线程立即能够看到该变量这种变化。Java内存模型是对共享变量进行volatile修饰,然后一个线程通过将在工作内存中的变量修改后的值同步到主内存,另一个线程会立马会看到变化,然后从主内存刷新最新值到工作内存中,这种依赖主内存的方式来实现可见性的。

总之,JVM内存模型是真的内存结构管理,Java内存模型只是为了适应和解决多线程通信而产生的一种模型,通过一些关键字修饰就可以实现并发。


http://chatgpt.dhexx.cn/article/ByHdMZhq.shtml

相关文章

JAVA内存模型与JVM内存模型的区别

** JAVA内存模型与JVM内存模型的区别 ** 直接进入正题 **JAVA内存模型: Java内存模型规定所有的变量都是存在主存中,每个线程都有自己的工作内存。线程堆变量的操作都必须在工作内存进行,不能直接堆主存进行操作,并且每个线程…

【3】Java内存模型

目录 知识点1:Java内存模型 知识点2:Volatile 1、什么是Volatile 2、Volatile特性 3、Volatile与Synchronized区别 知识点3:重排序 1、数据依赖性 2、as-if-serial语义 3、程序顺序规则 4、重排序对多线程的影响 知识点1&#xff1a…

Java内存模型详解

文章目录 一、什么是JMM?为什么需要JMM?二、JMM 如何抽象线程和主内存之间的关系?三、Java 内存区域和 JMM 有何区别?四、happens-before原则五、总结 一、什么是JMM?为什么需要JMM? Java 是最早尝试提供内…

java内存模型概述

java内存模型 为了控制线程之间的通信,(完成底层封装) 用来屏蔽掉各种硬件和操作系统之间的内存访问差异,以实现让Java程序在各平台下都能达到一致的内存访问效果。 JMM目标:定义程序中各个变量的访问规则&#xff0c…

理解Java内存模型(JMM)

本篇的写作思路是先阐明Java内存区域划分、硬件内存架构、Java多线程的实现原理与Java内存模型的具体关系,在弄明白它们间的关系后,进一步分析Java内存模型作用以及一些实现手段 理解Java内存区域与Java内存模型 Java内存区域 Java虚拟机在运行程序时会…

Java 内存模型

Java 内存模型(Java Memory Model),简称 JMM。 JVM 中试图定义一种 JMM 来屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 一、物理内存模型 物理机遇到的并发问题与虚拟机中…

Java内存模型

Java内存模型 1.内存模型概念图2.线程共享区方法区常量池运行时常量池全局字符串池class文件常量池 堆空间3.线程独占区虚拟机栈本地方法栈程序计数器 4.对象的创建 1.内存模型概念图 2.线程共享区 方法区 方法区也是线程共享区用于储存虚拟机加载的类信息(类的版…

一文看懂Java内存模型(JMM)

文章目录 Java内存模型介绍总览图Java内存模型图线程、主内存、工作内存关系图CPU缓存架构图Java内存模型与硬件内存架构的关系 什么是Java内存模型Java内存模型的意义Java内存模型规范 Java内存模型的主要结构1、程序计数器(Program Counter Register)2…

SPSS建立时间序列模型

原始数据可能并不是时间序列,因此,对这样的数据建立时间序列模型,分为以下几步: 1 生成时间序列:定义新的时间变量,并对原始数据进行平稳处理 a)定义时间变量: 选择按什么时间序列进行定义&am…

时间序列模型(ARIMA和ARMA)完整步骤详述

我于2019年发布此篇文章至今收获了许多人的指点,当时的代码的确晦涩难懂,近期有空,将代码重新整理了一遍,重新发送至此。希望能够帮助大家更好地理解。 建模步骤: 目录 数据包和版本申明 步骤一:数据准备…

机器学习之时间序列模型

一、时间序列概念 在生产和科学研究中,对某一个或一组变量x(t)进行观察测量,将在一系列时刻t1, t2, …, tn (t为自变量)按照时间次序排列,并用于解释变量和相互关系的数学表达式。在相等的时间间隔内收集到的不同时间点的数据集合我们称之为时…

数学建模学习笔记(十)——时间序列模型

文章目录 一、时间序列综述二、时间序列数据以及基本概念三、时间序列分解四、指数平滑模型五、一元时间序列分析的模型六、AR(p)模型七、MA(q)模型八、ARMA(p, q)模型九、模型选择:AIC 和 BIC …

时间序列模型步骤教程(ARIMA)

目录 0、前言一、数据准备&探索1、平稳性1.1 平稳性检验1.2 数据处理(平滑、变换、差分、分解)1.2.1 对数变换1.2.2 平滑法(移动平均&指数平均)1.2.3 差分法1.2.4 分解 2、非白噪声检验 二、模型(ARIMA&#x…

时间序列模型分析

目录 一个引言 定义 确定性时间序列分析方法概述 确定性时间序列模型类型 移动平均法 简单移动平均法 加权移动平均法 趋势移动平均法 指数平滑法 一次指数平滑法 1.预测模型​编辑 2.加权系数的选择​编辑 3.初始值的确定​编…

时间序列模型相关说明和模型介绍

一、什么是时间序列? 时间序列是在规律性时间间隔记录的观测值序列。依赖于观测值的频率,典型的时间序列可分为每小时、每天、每周、每月、每季度和每年为单位记录。 import pandas as pd df pd.read_csv(https://raw.githubusercontent.com/selva86/datasets/d…

常用的时间序列模型

白噪声模型 时间序列算法之ARIMA模型 对非平稳时间序列的分析方法可以分为确定性因素分解的时序分析和随机时序分析两个大类。 确定性因素分解的方法把所有序列的变化都归结为4个因素:长期趋势、季节变动、循环变动和随机波动。其中长期趋势和季节变动的规律性信息通…

数学建模之时间序列模型及其应用

摘要 时间序列模型就是将预测对象按照时间顺序排列起来,用这一组时间序列过去的变化规律,推断今后变化的可能性及变化趋势、变化规律。 时间序列模型也是一种回归模型,其一方面承认事物发展的延续性,运用过去的数据来推测事物的发展趋势;另一方面又考虑到偶然因素产生的随机性…

集成时间序列模型提高预测精度

使用Catboost从RNN、ARIMA和Prophet模型中提取信号进行预测 集成各种弱学习器可以提高预测精度,但是如果我们的模型已经很强大了,集成学习往往也能够起到锦上添花的作用。流行的机器学习库scikit-learn提供了一个StackingRegressor,可以用于…

时间序列规则和时间序列模型

1. 时间序列规则 1.1 什么是时间序列规则 对于赛题/业务的规则之前已经描述了它的重要性和应用,在此不再赘述。这章主要了解时间序列及其规则,和周期的应用。 1.1.1 时间序列 时间序列(或称动态数列):指将同一统计…

时间序列模型算法 - Prophet,LSTM(二)

时间序列模型 - Prophet 1.时间序列简介1.1 时间序列 - 平稳性检验1.1.1 log法1.1.2 差分法 1.2 平稳性的单位根检验 2.ARIMA3.Prophet3.1 Prophet的优点3.2 安装Prophet3.3 数据处理3.4 预测 4.LSTM4.1 数据处理4.2 训练预测 1.时间序列简介 在做时间序列时,首先要…