Java 内存模型和硬件内存架构笔记
2024-08-26 08:58:44
前言
可跟《主存存取和磁盘存取原理笔记》串着看
https://blog.csdn.net/suifeng3051/article/details/52611310
杂技
Java 内存模型(堆栈)
Jvm 内部,Java 内存模型把内存分成了两个部分:线程栈区和堆区:
栈区包含:线程执行信息(线程栈),本地原始类型变量(boolean,byte, short, int, long, float, double)
堆区包含:Java 应用创建的所有对象信息,基础类型的封装类
- 一个本地变量如果是原始类型,存储栈中
- 一个本地变量是一个对象的引用,那么这个本地引用存储栈,对象本身存储堆中
- 一个对象的成员方法,存储栈中,方法中包含的原始类型变量,存储堆中
- 一个对象的成员变量,无论是原始类型还是包装类型,都存储堆中
- 堆中数据可被多个线程共享,对于原始类型变量,每个线程都会拷贝一份
硬件内存架构
不管什么内存模型,最终还是运行在计算机硬件上,因此有必要了解计算机硬件的内存架构
- 现在计算机一般都有2个以上cpu, 每个cpu还有多个核心,线程会在各个cpu核心中并行运行
- CPU 内部会有一组CPU 寄存器、CPU 缓存(一级,二级,三级缓存),RAM主存
- 存储速度: CPU 寄存器 > CPU 缓存(一级> 二级> 三级) > RAM
- 存储大小 CPU 寄存器(64 bit) < CPU 缓存[一级(64k)> 二级(256k)> 三级(8MB)] < RAM(4G)
线程间的竞争现象
- 存在 count 为1, 两个线程都在缓存中保存一份备份
- 两个线程分别改变 count 的值,存在写缓存,顾缓存和 RAM的值存在偏差
- 当写缓存的数据 flush 到 RAM 就发生冲突了
内存屏障(Memory Barrier):
- 内存屏障,又称内存栅栏,是一个CPU 指令
- 保证特定操作的执行顺序。编译器和CPU会重排序指令,为了优化,插入内存屏障指令会让CPU不把这条指令重排序。
- 影响某些数据(或某条指令的执行结果)的内存可见性。强制刷新各种CPU cache, 写缓存的数据直接写入RAM,读缓存重新读取数据
内存屏障和 Java 有什么关系?
volatile 是基于 Memory Barrier 实现的。
这意味着,如果写入一个 volatile 变量a,可以保证:
- 一个线程写入变量a 后,任何线程访问该变量都会拿到最新值
- 由于会刷新 Cache中所有先前写入,因此写入变量a之前的写入操作,其更新的数据对于其它线程也是可见的
最新文章
- XML文件(2)--使用DOM4J示例
- 最长回文子串(Longest Palindromic Substring)
- excel导出字符串
- HDU 4753 Fishhead’s Little Game(DFS)
- tomcat 大并发报错 Maximum number of threads (200) created for connector with address null and port 8080
- 《BI那点儿事》SQL Server 2008体系架构
- 曲率已驱动了头发——深度分析谷歌AlphaGo击败职业棋手
- Delphi与C语言类型转换对照
- Android控件之ToggleButton(多状态按钮)
- Puppet学习:pp文件权限问题
- Python之日期与时间处理模块(date和datetime)
- 初入angular4——实际项目搭建总结
- Liunx-常用命令的总结(5)
- C语言之运算符、表达式和语句
- Visual Studio 代码快捷键
- 关于EasyUI datagrid 无法在dialog中显示的问题分析及解决方案!
- Linux 下 mysql的基本配置
- 【DM】The PageRank Citation Ranking: Bringing Order to the Web - PageRank引用排名:将订单带到Web上
- http和socket之长连接和短连接区别(转)
- Nutch2.2.1,window,eclipse,安装
热门文章
- 机器学习基石笔记:03 Types of Learning
- aaa配置(第十三组)
- 使用 pandas 导出数据
- mysql 开发进阶篇系列 14 锁问题(避免死锁,死锁查看分析)
- sql server 性能调优之 逻辑内存消耗最大资源分析1 (自sqlserver服务启动以后)
- salesforce零基础学习(九十二)使用Ant Migration Tool 实现Metadata迁移
- Windows编程之模块遍历(C++实现)
- Python3获取拉勾网招聘信息
- Java——对象比较
- Hive基础之Hive数据类型