JVM系列(7)——java内存模型

18 篇文章 0 订阅
9 篇文章 1 订阅

一、什么是JMM

一种抽象的规范。每个JVM 的实现都要遵守这样的规范,这样才能保证Java程序能够“一次编写,到处运行”。
内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出这样的底层细节。

二、JMM结构

1、CPU缓存模型

直接上图:
在这里插入图片描述
《深入理解高并发编程》 6.1.2 章节CPU多级缓存架构原理。
ps:挡住的字是,计算机中的主内存是所有cpu都可以访问的,并且主内存的容量比cpu缓存大。
在这里插入图片描述
图片来源:https://github.com/Snailclimb/JavaGuide/issues/1848
解释一下:
计算机在执行程序时,每条指令都是在CPU中执行的。而执行指令的过程中,势必涉及到数据的读取和写入。
程序运行过程中的临时数据是存放在主存(物理内存)当中的,这个时候,在读取写入数据时,CPU处理速度是远远大于内存的处理速度的!两个完全不一致。
CPU缓存模型的工作方式: 先复制一份数据到 CPU Cache 中,当 CPU 需要用到的时候就可以直接从 CPU Cache 中读取数据,当运算完成后,再将运算得到的数据写回 Main Memory 中。但是,依然会存在内存缓存数据不一致问题,这时候,通过制定缓存一致协议(比如 MESI 协议)可以解决此问题。

2、JMM模型

在这里插入图片描述
图片来源我的另一篇博客:多线程与高并发(2)——synchronized用法详解
解释一下:
从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。
主内存:所有线程创建的实例对象都存放在主内存中,不管该实例对象是成员变量还是方法中的本地变量(也称局部变量)
本地内存:每个线程都有一个私有的本地内存来存储共享变量的副本,并且,每个线程只能访问自己的本地内存,无法访问其他线程的本地内存。本地内存是 JMM 抽象出来的一个概念,存储了主内存中的共享变量副本。
比如X=0,线程1改成了X=1,那么它要同步给主内存,主内存再给到线程2,这就是线程之间的可见性
而,关于JMM的三大特性:原子性、可见性、有序性,可以参考多线程与高并发(2)——synchronized用法详解

三、乱序执行&&禁止乱序

以下内容均可参考:
多线程与高并发(2)——synchronized用法详解
多线程与高并发(5)——volatile关键字详解
多线程与高并发(3)——synchronized原理

1、乱序执行

cpu为了提高执行效率,当a指令去做其他事时,让b指令来执行。
不得不提的是,指令重排序。变量赋值操作的顺序与程序代码中的执行顺序是不一致的。
而为了防止乱序执行,JVM级别怎么规范呢?
类似于CPU内存屏障那样,JVM也定义了内存屏障。
在这里插入图片描述

2、volatile禁止乱序实现细节

(1)字节码层面
ACC_VOLATILE标识符。
(2)JVM层面
写的时候,前面加SS指令,后面加SL指令;
读的时候,前面加LL指令,后面加LS指令。
(3)OS和硬件层面
lock指令。

3、synchronized禁止乱序实现细节

(1)字节码层面
ACC_SYNCHRONIZED标识符,monitorenter和monitorexit标识符。
(2)JVM层面
c/c++调用操作系统提供的同步机制。
(3)OS和硬件层面
lock指令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为什么要学JVM1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深层次的问题。2、JVM是迈向高级工程师、架构师的必备技能,也是高薪、高职位的不二选择。3、同时,JVM又是各大软件公司笔试、面试的重中之重,据统计,头部的30家互利网公司,均将JVM作为笔试面试的内容之一。4、JVM内容庞大、并且复杂难学,通过视频学习是最快速的学习手段。课程介绍本课程包含11个大章节,总计102课时,无论是笔试、面试,还是日常工作,可以让您游刃有余。第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。第3章 类的加载、解释、编译,本章节带你深入理解类加载器的分类、范围、双亲委托策略,自己手写类加载器,理解字节码解释器、即时编译器、混合模式、热点代码检测、分层编译等核心知识。第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间等全部内容。第5章 对象模型,本章节带你深入理解对象的创建过程、内存分配的方法、让你不再稀里糊涂。第6章 GC基础,本章节是垃圾回收的入门章节,带你了解GC回收的标准是什么,什么是可达性分析、安全点、安全区,四种引用类型的使用和区别等等。第7章 GC算法与收集器,本章节是垃圾回收的重点,掌握各种垃圾回收算法,分代收集策略,7种垃圾回收器的原理和使用,垃圾回收器的组合及分代收集等。第8章 GC日志详解,各种垃圾回收器的日志都是不同的,怎么样读懂各种垃圾回收日志就是本章节的内容。第9章 性能监控与故障排除,本章节实战学习jcmd、jmx、jconsul、jvisualvm、JMC、jps、jstatd、jmap、jstack、jinfo、jprofile、jhat总计12种性能监控和故障排查工具的使用。第10章 阿里巴巴Arthas在线诊断工具,这是一个特别小惊喜,教您怎样使用当前最火热的arthas调优工具,在线诊断各种JVM问题。第11章 故障排除,本章会使用实际案例讲解单点故障、高并发和垃圾回收导致的CPU过高的问题,怎样排查和解决它们。课程资料课程附带配套项目源码2个159页高清PDF理论篇课件1份89页高清PDF实战篇课件1份Unsafe源码PDF课件1份class_stats字段说明PDF文件1份jcmd Thread.print解析说明文件1份JProfiler内存工具说明文件1份字节码可视化解析工具1份GC日志可视化工具1份命令行工具cmder 1份学习方法理论篇部分推荐每天学习2课时,可以在公交地铁上用手机进行学习。实战篇部分推荐对照视频,使用配套源码,一边练习一遍学习。课程内容较多,不要一次性学太多,而是要循序渐进,坚持学习。      

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值