IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JVM——CPU缓存架构与Java 内存模型 -> 正文阅读

[Java知识库]JVM——CPU缓存架构与Java 内存模型

一、CPU缓存架构与一致性协议

1.1 CPU缓存架构

现代 CPU 的发展非常快,内存的速度已经完全跟不上。如果将CPU完成一个基本操作所用的时间定义为时钟周期,那么 CPU 的指令处理速度要比内存的加载速度快100 倍左右。

为了解决这个性能上的鸿沟,现代 CPU 架构往往采用如下图所示的缓存架构:
在这里插入图片描述
在多核CPU和主存(Main Memory)之间引入三级高速缓存——L1、L2、L3

越靠近CPU的缓存,成本造价越高、性能越强、存储空间越小,其中 L3 缓存是多核共享,而L1、L2 是核内私有。

1.2 缓存行与伪共享问题

缓存行 Cache Line 是高速缓存一次读取内存数据的最小单位。目前最常见的 Intel cpu 的缓存行大小是 64 Bytes。
连续的数据很有可能由于数据跨度恰好在一个缓存行内,就很有可能会被CPU加载到 L1、L2、L3 高速缓存中。

由于高速缓存的存在,引出了缓存一致性协议,它可以保证 L1、L2、L3 中的数据在多核CPU和并发场景下不会出现线程不一致问题。早期的解决方案并不是各种缓存一致性方案,而是采用总线锁的方式。

总线锁,顾名思义就是将高速缓存与主内存之间的总线上锁,只允许一个线程去获取并操作上锁数据,处理完成后释放锁,并将数据从缓存中刷回主存。这种方式虽然安全,但也牺牲了很大的性能。于是,人们又引入了诸如 MESI 的缓存一致性协议。简单的说,就是给缓存数据做标记,如果CPU发现缓存的数据失效了,就必须从主存中重新加载最新的数据。

那什么又是伪共享呢?

伪共享是缓存行加载数据时必然会存在的性能损耗问题。当对象中包含线程局部变量,且尺寸大小小于 64 字节,就有可能发生伪共享问题。

再具体点,内存地址连续的不同变量被加载到了同一个缓存行中,而同一个缓存行中的多个变量,又不一定是CPU所需的,这种情况就是伪共享。

由于伪共享的存在,CPU核心中的高速缓存加载了本不需要数据,又在“缓存一致性协议”的要求下,不得不在这些无用数据失效后重新加载缓存,导致缓存失效,或造成性能损耗:
在这里插入图片描述
如上图所示,x、y 两个变量由 Main Memory 加载到 core 1 和 core 2两个核心的 L1、L2 缓存中。如果线程A、B 跑在两个核心上,且线程 A 修改 core 1 中的 x,由于缓存一致性协议, core 2 中的 x 变量将会失效,它必须从主内存中重新加载,这样频繁的加载、访问主内存, core 2 中的 L1、L2 缓存几乎等于失效。

1.3 MESI 缓存一致性协议

MESI是缓存锁的实现方式之一,注意这是 CPU 缓存一致性,并非通常说的应用缓存。有些无法被缓存的数据或跨多个缓存行的数据依然必须使用总线锁。

MESI 的核心思想是为每个 Cache Line 标记 4 种状态:
在这里插入图片描述

  1. 若缓存数据更改过,则将 Cache Line 标记为 M
  2. 如果缓存数据是独享,则标记为 E
  3. 如果数据是被多个CPU读取,则标记为 S
  4. 如果数据被其他CPU修改过,则标记为 I

1.4 伪共享的解决办法

Java 7 之前可以采用字节填充的方式,例如针对不同操作系统和对象头的大小,补齐多个 long 类型的空数据。
但这种方式在 Java 7 的某个版本中会出现 填充失效问题,原因是该版本的虚拟机优化了未使用 field 的排布。

在 Java 8 加入 @Contended 注解会帮助增加128 字节的 padding,并且需要开启 -XX:-RestrictContended 选项才能生效。

虽然解决了伪共享的问题,但是这种填充的方式也浪费了缓存资源,而且缓存又小又贵,时间和空间的取舍要酌情考虑。

二、JMM Java 内存模型

2.1 JMM 简介

JMM 全称是 “Java Memory Model”,Java 内存模型。
因为在不同的硬件生产商和操作系统下,内存的访问方式各有所差异,这样就会造成相同的代码出现不一样的问题,而 JMM 屏蔽掉了各种操作系统的内存访问差异,以实现“Write Once,Run Anywhere”的目标

JMM 中规定所有的变量都存储在主内存 (Main Mem)中,包括实例变量、静态变量,但是不包括局部变量和方法参数。每条线程都有自己的工作内存(Work Mem),线程私有。工作内存中保存的是线程的变量从主内存中的拷贝副本

这种结构的基本工作方式是:线程对变量的读和写都必须在工作内存中进行,而线程之间变量值的传递均需要通过主内存来完成。如下图所示,注意与Java 内存结构(堆栈等)等概念区分开。

在这里插入图片描述

2.2 原子性、可见性、有序性

整个 JMM 实际上是围绕着三个并发特征建立起来的——原子性、可见性、有序性

  1. 原子性:和事务的 ACID 的 原子性概念一致,即表示一个操作中间不可分割,不能中断,执行过程不允许被其他线程打扰。 JMM 只能保证基本操作的原子性,如果要保证一个代码块的原子性,Java 提供了 synchronized 关键字,它对应了 monitorentrer 和 monitorexit 字节码指令。
  2. 可见性:不同的线程对数据的修改结果可以被其他线程感知到,这就是可见性。synchronized 是保证可见性的最常用的操作,除此之外,还有 volatile 关键字,它是较弱的同步机制。
  3. 有序性:字节码指令的执行顺序不可重排。可以使用 synchronized 或 volatile 保证多线程之间操作的有序性。volatile是使用内存屏障达到禁止指令重排,保证有序性。而 synchronized 则以互斥锁的形式要求上锁的资源必须按序执行。

2.3 八大内存交互操作

在这里插入图片描述
说是 8 中内存交互操作:

  • lock 和 unlock:锁定与解锁。作用于主内存的变量,将其设置为线程独占或解除。
  • Read 和 Write:发生在主内存和工作内存之间,将变量传输到工作内存,将从工作内存得到的值放入主内存中。
  • Load 和 Store:作用于工作内存的变量,将工作内存中的变量放入副本中,将工作内存中的变量传输到主内存中。
  • Use 和 Assign:将工作内存中的变量传输到执行引擎,将一个从执行引擎中接收到的值赋值给工作内存的副本。

使用规则:

  • 不允许 read、load、store、write 操作之一单独出现,即 read 操作后必须 load,store后必须 write。
  • 不允许线程丢弃它最近的 assign 操作,即工作内存中的变量修改之后,必须告知主存。
  • 不允许线程将没有 assign 的数据从工作内存同步到主存。
  • lock 和 unlock 必须成对出现。
  • 新的变量必须由主存中诞生。
  • 如果对一个变量进行 lock,会清空所有工作内存中此变量的值。在执行引擎使用这个变量前,必须重新 load 或 assign 。
  • unlock 之前,必须将此变量同步回主内存。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 22:56:54  更:2021-07-22 22:56:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/18 17:40:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码