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

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.mzph.cn/news/102830.shtml

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

相关文章

Unity编辑器从PC平台切换到Android平台下 Addressable 加载模型出现粉红色,类似于材质丢失的问题

Unity编辑器在PC平台下使用Addressable加载打包好的Cube,运行发现能正常显示。 而在切换到Android平台下,使用Addressable时加载AB包,生成Cube对象时,Cube模型呈现粉红色,出现类似材质丢失的问题。如下图所示。 这是…

重绘与重排(回流)

前言 最近写的都是写基础知识,为了提高巩固自己的知识体系,抽空就总结或复习一个知识点。为了防范于未然,说不定哪天就得重新找工作了。如何提高渲染时间,优化前端性能,必有减少重绘和重排。之前在前端性能优化上叶有…

安全设备和防火墙

文章目录 微步TDP态势感知防火墙防火墙的负载均衡 微步TDP态势感知 安全设备的主要功能在黑名单,只要记住黑名单的功能在哪即可 常用的是威胁选项卡的监控功能,监控模块会把实时的告警列出来,只要列出来就能分析流量是误报还是真实的&#x…

【GO】基础速成

简单介绍一下go好处 编译语言,可以提前报错同时又有python的一些优点,自带多线程 开始学习 学习网站:学习网站 值 包含:字符串、整型、浮点型、布尔型等等 字符串可以 进行拼接。 需要注意的是布尔型在go里面不自动转化为in…

tomcat服务tomcat多实例部署

tomcat服务&&tomcat多实例部署 文章目录 tomcat服务&&tomcat多实例部署1.简介2.优缺点优点:缺点: 3.工作原理4.工作流程5.tomcat服务部署5.1.java环境安装5.2.拉取tomcat软件包5.3.解压部署5.4.启动tomcat服务5.5.访问tomcat的web页面5.…

Kafka数据同步原理详解

Kafka数据同步原理详解 Kafka是一种分布式的消息队列系统,它具有高吞吐量、可扩展性和分布式特性等优势。在Kafka中,数据按照主题进行分区,每个主题都有一组分区。每个分区都有自己的生产者和消费者,生产者负责向分区中写入消息&…

基于VUE的图书借阅管理系统的设计与实现

目录 一、摘要 二、技术描述 三、部分截图 四、获取方式 一、摘要 随着我国经济的高速发展,人们对图书的需求也愈发旺盛,而传统图书管理模式存在以下弊端:信息存储和分类操作不够高效,导致查找书籍困难;借还书流程…

【数据结构-栈 二】【单调栈】每日温度、接雨水

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【单调栈的应用】,使用【栈】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&am…

恢复grub在硬盘对多系统的引导

grub2引导被覆盖怎么办 问题的提出问题的解决1 进入try ubuntu系统2 执行如下命令 验证 问题的提出 windows和ubuntu双系统引导出错,硬盘的grub引导被windows的引导覆盖,导致只能进入windows系统,不能引导ubuntu系统。 问题的解决 1 进入t…

location rewrite

Nginx location 匹配的规则和优先级 Nginx常用的变量 rewrite: 重定向功能 Location 匹配 URI URI:统一资源的表示符,是一种字符串标识,用于标识抽象或者物理资源 先来巩固一些与location结合使用的正则表达式 正则表达式:匹…

基于安卓android微信小程序音乐播放器

运行环境 小程序前端框架:uniapp 小程序运行软件:微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 项目介绍 音乐播放器小程序的设计主要是对系统所要实现的功能进行详细考虑,确定所要…

【机器学习 | 回归问题】超越直线:释放多项式回归的潜力 —— 详解线性回归与非线性 (含详细案例、源码)

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

【数据结构-字符串 四】【字符串识别】字符串转为整数、比较版本号

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

封装 Token

什么是token? 作为计算机术语,是“令牌”的意思 。 Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请…

docker使用nginx

使用docker run命令运行Nginx应用 使用命令可以直接启动 [rootlocalhost ~]# docker run -d nginx:latest Unable to find image nginx:latest locally latest: Pulling from library/nginx a2abf6c4d29d: Pull complete 下载完成 a9edb18cadd1: Pull complete 589b7251471a:…

Java Day1

day01 一、Markdown 基础语法1.标题2. 字体3. 引用 >4. 分隔线 --- ***5. 图片 ![]()6.超链接7.列表8.表格9.代码 代码名称 二、计算机三、常用快捷键1. Win 系列2. Ctrl 系列3. ALt 系列 四、 基本的DOS命令1. 打开方式:2. 常用DOS命令 五、计算机语言发展史第一…

【软件测试学习】—软件测试知识点总结(二)

【软件测试学习】—软件测试的分类(二) 一、软件测试的分类 二、软件的生命周期 三、软件测试的工作流程 四、软件测试用例设计方法 (一)、等价类划分 定义:等价类划分是一种典型的、重要的黑盒测试的方法&#xff…

从零开始探索C语言(十一)----共用体和位域

文章目录 1. 共用体1.1 定义共用体1.2 访问共用体成员 2. 位域2.1 位域声明2.2 位域的定义和位域变量的说明2.3 位域的使用2.4 位域小结 1. 共用体 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体&#…

JavaFx学习问题2--音频、视频播放失败情况

文章目录 一、路径注意事项:① 用相对路径的时候别忘了前面的斜杠② uri问题 二、播放不了的问题① 获取的媒体文件路径本身就是不对的② 必须是uri 额外收获: 一、路径注意事项: ① 用相对路径的时候别忘了前面的斜杠 并不是什么大问题,只是…

2.Javaweb模块基本

1.1web基本 session 和 cookie 有什么区别? 存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。 安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。 容量和个数限制:…