一文拿捏对象内存布局及JMM(JAVA内存模型)

news2025/9/20 20:53:09

1 JMM(Java Memory Model)

1 概述

Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的一组规则或者规范。通过这些规则、规范定义了程序中各个变量的访问方式jvm运行的程序的实体是线程,而每个线程运行时,都会创建一个工作内存(也叫栈空间),来保存线程所有的私有变量。而JMM内存模型规范中规定所有的变量都存储在主内存中,而主内存中的变量是所有的线程都可以共享的,而对主内存中的变量进行操作时,必须在线程的工作内存进行操作,首先将主内存的变量copy到工作内存,进行操作后,再将变量刷回到主内存中。所有线程只有通过主内存来进行通信。

  1. JMM描述的是对程序中变量访问方式的规则规范

  2. JVM运行程序的实体是线程,每个线程有其工作空间,用于存储私有变量

  3. JMM规定所有的变量需存储在主内存中,主内存的变量是所有线程共享的

  4. 对主内存的变量操作,需要将主内存变量copy到线程的工作空间

  5. 在线程工作空间操作完之后,刷回主内存

2 可见性,原子性与有序性

1 原子性

原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程给打断。

在java中,对基本的数据类型的操作都是原子性的操作,但是要注意的是对于32位系统的操作对于long、double类型的并不是原子性操作(对于基本数据类型,byte,short,int,float,boolean,char读写是原子操作)。因为对于32位的操作系统来说,每次读写都是32位,而doubel、long则是64位存储单位。就会导致一个线程操作完前面32位后,另一个线程刚好读到后面的32位,这样一来一个64位被两个线程分别读取。

2 可见性

可见性指的是当一个共享变量被一个线程修改后,其他线程是否能够立即感知到。对于串行执行的程序是不存在可见性,当一个线程修改了共享变量后,后续的线程都能感知到共享变量的变化,也能读取到最新的值,所以对于串行程序来讲是不存在可见性问题。

对于多线程程序,就不一定了,前面分析过对于共享变量的操作,线程都是将主内存的变量copy到工作内存进行操作后,在赋值到主内存中。这样就会导致,一个线程改了之后还未回写到主内存,其余线程就无法感知到变量的更新,线程之间的工作内存是不可见的。另外指令重排序以及编译器优化也会导致可见性的问题。

3 有序性

有序性是指对于单线程的代码,我们总是认为程序是按照代码的顺序进行执行,对于单线程的场景这样理解是没有问题,但是在多线程情况下, 程序就会可能发生乱序的情况,编译器编译成机器码指令后,指令可能会被重排序,重排序的指令并不能保证与没有排序前的保持一致。

在java程序中,倘若在本线程内,所有的操作都可视为有序性,在多线程环境下,一个线程观察另外一个线程,都视为无顺序可言。

 3 JMM如何解决原子性&可见性&有序性

1 原子性问题

除了jvm自身提供的对基本类型的原子性操作以外,可以通过synchronized和Lock实现原子性。synchronized与lock在同一时刻始终只会存在一个线程访问对应的代码块。

2 可见性问题

volatile关键字保证了可见性。当一个共享变量被volatile修饰时,它会保证共享变量修改的值立即被其他线程可见,即修改的值立即刷新到主内存,当其它线程去需要读取变量时,从主内存中读取。synchronized和Lock也保证了可见性。因为同一时刻只有一个线程能访问同步代码块,所以是能保证可见性。

3 有序性问题

volatile关键字保证了有序性,synchronized和Lock也保证了有序性(因为同一时刻只允许一个线程访问同步代码块,自然保证了线程之间在同步代码块的有序执行)。

2 对象内存布局

1 对象头区

  1. 对象标记

    • 锁标记

    • 是否偏向

    • hashCode值

    • 对象分代年龄 ✨对象头Mark区四位二进制:0000-1111 --> 最多15轮GC

  2. 类元指针: 指向方法区中的类元信息 java底层实现反射的基础

  3. 数组长度

2 实例数据区

真正属性信息的值

3 对齐填充区

为了保证对象是8字节的倍数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1086134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网页视频F12倍速看

首先在看视频的网页,点击F12,出现下方页面,其他页面不用管 方式一: document.querySelector("video").playbackRate"16"; 16指的是倍速,可随意修改 方式二: document.querySelecto…

203、RabbitMQ 之 使用 direct 类型的 Exchange 实现 消息路由 (RoutingKey)

目录 ★ 使用direct实现消息路由代码演示这个情况二ConstantUtil 常量工具类ConnectionUtil 连接RabbitMQ的工具类Publisher 消息生产者测试消息生产者 Consumer01 消息消费者01测试消费者结果: Consumer02 消息消费者02测试消费者结果: 完整代码&#x…

Centos8 openjdk升级

1、卸载旧版本 sudo dnf remove java-1.8.0-openjdk 2、搜索新版本 yum search java-11-openjdk3、安装新版本 dnf install java-11-openjdk.x86_644、验证新版本 java -version

Python+”高光谱遥感数据处理与机器学习深度应用丨高光谱数据预处理-机器学习-深度学习-图像分类-参数回归

涵盖高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论,旨在帮助学员深入理解科学原理。结合Python编程工具,专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&#xf…

《UnityShader入门精要》学习2

UnityShader 基础 UnityShader 概述 一对好兄弟:材质和UnityShader 总体来说,在Unity中我们需要配合使用材质(Material)和Unity Shader才能达到需要的效果。一个最常见的流程是: (1)创建一个…

第 5 章 数组和广义表(稀疏矩阵的三元组顺序表存储实现)

1. 背景说明 为了节省存储空间&#xff0c;可以对这类矩阵进行压缩存储。所谓压缩存储是指&#xff1a;为多个值相同的元只分配一个存储空间&#xff0c;对零元不分配空间。 2. 示例代码 1)status.h /* DataStructure 预定义常量和类型头文件 */ #include <string.h>#i…

Adobe Premiere Elements 2024:轻松创建精彩视频的简化版专业工具

随着视频内容的日益流行和人们对高质量多媒体内容的需求不断增长&#xff0c;Adobe Premiere Elements 2024 成为了许多非专业视频编辑者首选的工具。这款软件究竟有何特别之处&#xff1f;本文将详细介绍 Adobe Premiere Elements 2024&#xff0c;并为您揭示它的简化版专业功…

Java集合(四) --- Map

好潦草的一篇文章&#xff0c;不想学习想摆烂了又 &#xff0c;凑合看 文章目录 一、Map的实现类的结构二、Map结构的理解三、HashMap的底层实现原理? 以jdk7的说明:四、Map中定义的方法五、总结&#xff1a;常用方法六、代码 提示&#xff1a;以下是本篇文章正文内容&#xf…

企业活动目录管理利弊

凡事都有利和弊&#xff0c;那么如何解决企业活动目录管理中的各种弊端呢&#xff1f; 首先Windows环境是目前企业使用率最高的网络环境&#xff0c;作为windows最核心的组件&#xff0c;活动目录&#xff08;AD域&#xff09;自然被很多企业使用&#xff0c;其主要作用就是更…

goland 旧版本使用1.19环境

C:\Go\src\runtime\internal\sys\zversion.go // Code generated by go tool dist; DO NOT EDIT.package sysconst StackGuardMultiplierDefault 1const TheVersion go1.19引入其他包的标识符 package mainimport ("fmt""gotest/test")func main() {f…

扫描器(xray和bp联动)

文章目录 分类主动扫描和被动扫描bp与xray联动 分类 扫描器分为对web的扫描器和对主机的扫描器 主动扫描和被动扫描 主动扫描&#xff1a; 输入某个URL&#xff0c;然后由扫描器中的爬虫模块爬取所有链接&#xff0c;对GET、POST等请求进行参数变形和污染&#xff0c;进行重放测…

利用Cpolar内网穿透+HadSky技术构建您的私密高效论坛网站

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

YOLOv7改进:CoordAttention新型的轻量级自注意力机制| CVPR2021

💡💡💡本文独家改进:CoordAttention是一种新型的自注意力机制,可以加入到YOLOV7中不同位置验证涨点可行性 CoordAttention| 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀�…

docker compose 部署ELK 8.X及监控

1. 前置环境 安装docker 安装docker-compose 相关版本&#xff1a; ES&#xff1a;8.5.0 kibana&#xff1a;8.5.0 logstash&#xff1a;8.5.0 2. docker-compose yaml文件 # 在指定路径创建配置文件 vim docker-compose-es-kibana-logstash.yamlversion: "3"…

【知网检索征稿】第三届社会发展与媒体传播国际学术会议(SDMC 2023)

第三届社会发展与媒体传播国际学术会议&#xff08;SDMC 2023&#xff09; 2023 3rd International Conference on Social Development and Media Communication 第三届社会发展与媒体传播国际学术会议 (SDMC 2023)将于2023年11月03-05日在中国杭州召开。会议主题主要围绕社会…

【独家】网络电视盒子哪个品牌好?实测总结目前性能最好的电视盒子

电视盒子可谓是居家必备&#xff0c;尤其是对老人小孩来说使用频率非常高&#xff0c;我做数码测评这几年陆陆续续已经测评过30多款电视盒子了&#xff0c;今天盘一盘目前性能最好的电视盒子&#xff0c;给不懂如何挑选电视盒子的朋友们做个参考。 NO.1 泰捷WEBOX WE40S电视盒子…

让数据“动”起来:Python动态图表制作!

在读技术博客的过程中&#xff0c;我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的&#xff1f;难度大吗&#xff1f;这篇文章就介绍了 Python 中一种简单的动态图表制作方法。 数据暴增的年代&#xff0c;数据科学家、分析师在被要求对数据有…

域渗透04-漏洞(CVE-2020-1472)

Netlogon协议&#xff1a; 想了解CVE-2020-1472&#xff0c;我们首先必须要了解Netlogon协议是什么&#xff1a; Netlogon 远程协议是 Windows 域控制器上可用的 RPC 接口。它用于与用户和计算机身份验证相关的各种任务&#xff0c;最常见的是方便用户使用 NTLM 协议登录到服务…

计算机毕业设计选什么题目好?springboot 健身房管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Tmux教学【有图有代码】

Tmux教学【有图有代码】 0、前言1、Tmux基本概念1.1 安装 2、Tmux使用2.1 session操作2.2 window操作2.3 pane操作2.4 其他操作 3、日常中Tmux的工作流 0、前言 想必同学们在跑代码时也许会存在这样一个问题&#xff1a; 本地在连接远程服务器跑代码的时候&#xff0c;本地ssh窗…