我眼中的Java内存模型

news2024/9/25 9:35:54

一.JVM内存结构

         

 (1)方法区只是一种概念上的区域,并说明了其应该具有什么功能,但是没有规定这个区域到底应该处于何处,不同版本的方法区所处位置不同,并不是绝对意义上的物理区域。

 (2)运行时常量池用于存放编译器生成的各种字面量和符号应用,但是java语言并不要求常量只有在编译器才能产生。比如在运行期,String.intern也会把新的常量放入池中。

二.Java内存模型

java内存模型是根据英文Java Memory Model (JMM),它只是一个抽象的概念,JMM和多线程相关,表述了一组规则和规范,这个规范定义了一个现成对共享变量的写入时对另一个线程可见的。

Jav的多线程之间时通过共享内存进行通信的,而由于采用共享内存进行通信,就会出现原子性,可见性,顺序性问题,而JMM就是围绕多线程通信以及与其相关的一系列特性而建立的模型,JMM定义了一些语法集,这些语法集就是java语言中的volatile 和 synchonized等关键字。

在JMM中,我们把多个线程间通信的共享内存叫主内存,而在并发编程中多个线程都维护了一个自己的本地内存(这是个抽象概念)其中保存的数据时主内存中的数据拷贝,而JMM主要是控制本地内存和主内存直接的数据交互。

 三.JAVA对象模型

虚拟机中,设计了一个OOP-Klass Model ,OOP 指的是普通对象指针,而Klass用来描述对象实例的具体类型。

每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示Java类,当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据。

 

四 java内存模型详解

        1.为啥会有java内存模型?

                计算机执行程序的死后,指令都是在cpu里面执行的,执行又要哥数据打交道,数据放在主存当中,就是计算机的物理内存。 随着CPU技术的发展,CPU的执行速度越来越快,内存就跟不上啦,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会越来越大,这就导致CPU每次操作都要等待内存的结果。

        这时候,我们想出来一个办法,就是在CPU和内存之间增加高速缓存,缓存的特点就是速度快,内存小,主要是贵!接下来程序执行就变成了:当程序在运行过程中,会讲运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从他的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。

而随着CPU能力的不断提升,一层缓存就慢慢的无法满足要求了,就逐渐的衍生出多级缓存。

按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存(L1),二级缓存(L3),部分高端CPU还具有三级缓存(L3),每一级缓存中所储存的全部数据都是下一级缓存的一部分。这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。那么,在有了多级缓存之后,程序的执行就变成了:当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。

现在CPU都呦多个核心,每个核心都含有一套L1设置L2缓存,而共享L3缓存。

 随着计算机能力不断提升,开始支持多线程。那么问题就来了。我们分别来分析下单线程、多线程在单核CPU、多核CPU中的影响。

单线程。 cpu核心的缓存只被一个线程访问。缓存独占,不会出现访问冲突等问题。

单核CPU,多线程。 进行中的多个线程会同事访问进程中的共享数据,CPU将某块内存加载到缓存中,不同线程在访问相同的物理地址的时候,都会映射到相同的缓存位置,这样即便发生线程的切换,缓存仍然不会失效,但由于任何时刻只能有一个线程在执行,因此不会出现缓存访问冲突。

多核CPU,多线程。每个核都至少有一个L1缓存,多个线程访问进程中的某个共享内存,且这多个线程分别在不同的核心上执行。则每个核心都会在各自的cache中保留一份共享内存的缓冲,由于多喝是可以并行的,可能会出现多个线程同时写各自的缓存的情况,而各自的cache之间的数据就有可能不同。

在CPU和主存之间增加缓存,在多线程场景中就可能存在缓存一致性问题,也就是说,在多核CPU中,每个核的自己的缓存中。关于同一个数据的缓存内容可能不一致。

 在多线程场景下会存在缓存一致性问题,除了这种情况,还有一种硬件问题也比较重要,那就是为了使处理器内部的运算单元能够尽量的被充分利用,处理器可能会对输入代码进行乱序处理,很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排。

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

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

相关文章

CSRF攻击方式及预防准则

跨站点请求伪造(CSRF) 是一种攻击类型,当恶意网站、电子邮件、博客、即时消息或程序导致用户的Web浏览器在用户通过身份验证后对受信任的站点执行不需要的操作时,就会发生这种攻击。CSRF攻击之所以有效,是因为浏览器请…

OpenHarmony#深入浅出学习eTs#(二)拖拽式UI

本项目Gitee仓地址:深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、创建支持Super Visual的工程 在这里选择直尺Super Visual的选项,调整当前路径,进入绘制界面 二、UI设计界面介绍 在左侧是路径(即文件管理器&#x…

3.我们一起来学习Linux 安装

Linux 安装 本章节我们将为大家介绍 Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果自己不想搭建,也可以直接买一台学习用用。 本章节以 centos6.4 为例。 可以去官网下载最新版本&…

【C语言进阶】通讯录再优化?学会文件操作,没有数据库也能保存和管理本地数据

目录 🥝前言🥝: 一、🍓文件概述🍓: 1.为什么使用文件: 2.什么是文件: ①.程序文件: ②.数据文件: ③.文件名: 二、🍊文件顺序读写&…

JAVA集成阿里云OSS对象存储

JAVA集成阿里云OSS对象存储1 : 配置集成1.1、对象存储OSS2 : 代码配置2.1、说明2.2、配置文件2.3、加载配置文件代码2.4、封装统一的DTO2.5、OSS上传Controller2.6、OSS上传Service2.7、OSS上传ServiceImpl3 : 测试3.1、文件上传3.2、文件迁移4 : 总结4.1、参考资料4.2、注意事…

浅谈 C++ 字符串:std::string 与它的替身们

浅谈 C 字符串:std::string 与它的替身们 文章目录浅谈 C 字符串:std::string 与它的替身们零、前言一、前辈:C 风格的字符串1.1 什么是 C 风格的字符串1.2 C 风格的字符串有什么缺陷1.2.1 以 \0 作为结尾,没有直接指明长度1.2.2 …

Android技术分享——APT实现ButterKnife【实战学习】

APT APT (Annotation Processing Tool) 是一种处理注释的工具,它对源代码文件进行检测并找出其中的 Annotation,根据注解自动生成代码,如果想要自定义的注解处理器能够运行,必须要通过 APT 工具来处理。 …

Python实现FA萤火虫优化算法优化支持向量机分类模型(SVC算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , 作…

maven第一篇:安装maven以及配置

本篇就是聊如何在电脑上安装maven,以及简单的配置基础环境。 首先需要了解什么适合maven,对于这个理论知识,还是老规矩直接复制一下; Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象…

提速300%,PaddleSpeech语音识别高性能部署方案重磅来袭!

在人机交互的过程中,语音是重要的信息载体,而语音交互技术离不开语音识别与语音合成技术。飞桨语音模型库PaddleSpeech为开发者们使用这些技术提供了便捷的环境。本次PaddleSpeech迎来重大更新——1.3版本正式发布。让我们一起看看,这次Paddl…

这样实操一下 JVM 调优,面试超加分

1.写在前面 前段时间一位读者面了阿里,在二面中被问到 GC 日志分析,感觉回答的不是很好,过来找我复盘,大致听了他的回答,虽然回答出了部分,但是没抓到重点。 GC 日志分析算是 JVM 调优中比较难的部分&…

【XR】如何提高追踪保真度,确保内向外追踪系统性能

Constellation是Oculus研发的追踪系统。日前,负责AR/VR设备输入追踪的Facebook工程经理安德鲁梅利姆撰文介绍了他们是如何用基于Constellation追踪的控制器来提高交互保真度。具体整理如下: 我们的计算机视觉工程师团队一直在努力为Oculus Quest和Rift …

【再学Tensorflow2】TensorFlow2的模型训练组件(1)

TensorFlow2的模型训练组件(1)数据管道构建数据通道应用数据转换提升管道性能特征列特征列用法简介特征列使用示例激活函数常用激活函数激活函数使用示例Tensorflow模型中的层内置的层自定义模型中的层参考资料Tensorflow中与模型训练相关的组件主要包括…

图像采样与量化

数字图像有两个重要属性:空间位置(x,y)以及响应值I(x,y)。数字图像中像素的空间位置及响应值都是离散值,传感器输出连续电压信号。为了产生数字图像,需要把连续的数据转换为离散的数字化形式。采用的方式是图像量化与采样。 图像采样 图像量化…

【数据结构】(初阶):二叉搜索树

​ ✨前言✨ 🎓作者:【 教主 】 📜文章推荐: ☕博主水平有限,如有错误,恳请斧正。 📌机会总是留给有准备的人,越努力,越幸运! 💦导航助手&#x…

Docker+Selenium Grid运行UI自动化

简介 使用Selenium Grid可以分布式运行UI自动化测试,可以同时启动多个不同的浏览器,也可以同时启动同一个浏览器的多个session。这里使用Docker Compose来同时启动不同浏览器的容器和Selenium Grid,只需一条命令就把自动化运行环境部署好了。…

verilog仿真技巧与bug集合

文章目录赋值语句想法一些建议时钟信号关于异步fifo写入数据时wp1,读出数据时rp1一些自己的bug关于操作符&关于if-else关于modelsim使用1.初学者不建议在设计文件中加入仿真语句; 2.初学者也不会在tb里使用类似always一样的设计。 对于1.因为把仿真…

国产RISC-V处理器“黑马”跑分曝光!超过多数国内主流高性能处理器!

来源企业投稿 2010年,开源、开放、精简的RISC-V架构诞生。虽然距今仅有12年,但RISC-V迎来了众多玩家的积极参与,其技术、生态、应用都快速发展。在许多秉持匠心的技术人员的耕耘下,RISC-V也早已从传统强项物联网走出,…

error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type

文章目录1、报错error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type2、解决办法3、uint8_t此类数据类型补充4、码字不易,点点赞1、报错error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type 在网络编程PING程序时遇到的小bug&am…

【BUUCTF】MISC(第二页wp)

文章目录被劫持的神秘礼物刷新过的图片[BJDCTF2020]认真你就输了[BJDCTF2020]藏藏藏被偷走的文件snake[GXYCTF2019]佛系青年[BJDCTF2020]你猜我是个啥秘密文件菜刀666[BJDCTF2020]just_a_rar[BJDCTF2020]鸡你太美[BJDCTF2020]一叶障目[SWPU2019]神奇的二维码梅花香之苦寒来[BJD…