00:00
好,各位同学大家好,接下来为大家带来第六章Java内存模型GMM,那么在开篇学这章之前,咱们先闲聊一句题外话,切记,JMM是指Java内存模型,我们的GVM是指Java虚拟机的意思,两者是截然不同的两个东系,千万不要搞混了,OK,他们两个就像雷锋和雷锋塔的关系,Java和javascript这种语言的关系,是两个截然不同的东东,OK,好,那么接下来我们来看一下g mm Java内存模型,它是什么?能干些什么?那么首先这个片理论解释涉及到底层操作系统和硬件的知识啊,这个对于我们。熟悉、深度了解高并发是必要的,内功好,那么同学们老规矩。大厂不考,大厂不考,我们不讲来吧。那么请问你知道什么是Java内存模型GMM吗?那么GMM与V他们两个之间的关系,好V我们前面也用过一点,而且我也默认大家懂,但是深度的东西,那么像放心杨哥讲的东西,一定跟你目前所知的东西是两回事,比方说我们会从底层操作系统和内存屏障store store store load load load load store等等四大内存屏障给大家再深度的讲解,好在这块我们先放下不表,那么且切记GM和也有关系,那么来GM有哪些特征?或者说你知不知道GM规范下面它的三大特征是哪三个?
01:32
好,那么你是否知道界面为什么要设定这三大特征?比如说我们所知道的可见。原子和禁止指令重排OK好了,那么为什么要有这门目?它为什么会出现?作用和功能是什么?我们再来happens before,先行发生原则你有没有过了解啊,这是是些什么鬼那们。所以说各位亲。没办法,继续跟着杨哥一起卷,咱们接着奏乐,接着舞,将学习进行到底。OK,来,首先。
02:05
我们先来说一下计算机的硬件存储系统,注意这块如果学过计算机操作系统和计算机硬件的同学,可能理解起来就非常OK,但是没学过的也没关系。那么大家呢?继续在B站大学研读计算机专业,OK,来,先看计算机硬件存储系统,首先来我们先看这张图,我们先说硬件,再说知识。来,同学们打开你的电脑,这有个东西叫任务管理器,找到我们这儿有个性能那。打开它以后,大家看最经典的是不是CPU,内存和硬盘,那么对于我们这CPU而言,大家请看老师呢是。2.8亿。G,然后呢?八八个逻辑处理器四核的,注意这有个L1缓存,L2缓存,L3缓存,那么来看一下。我是I7的CPU,你的CPU好不好就要看你的缓存有几级。
03:01
有些是二级,有些是三级,再看看你的缓存分别是多大,那么自然而然,如果你的缓级,缓存层级越多,缓存越大,自然而然你系统的性能就越好,那么在在这我们会明白了,原来在CPU这有一个组件叫缓存,那么它是什么东东,怎么出现的呢?那么下面听我慢慢道来。首先啊,我们从下到上来,这是网络,这是硬盘,这是主物理内存,就是咱们这儿的这个内存,相当于我们插到硬盘主板上,OK,一般我们说的买内存条,去京东上买个内存条,主要就是指它,那么注意在内存和寄存器就是CPU,那么最上面就是CPU啊,在内CPU和主内存,主物理内存之间有这个缓存,那么现在这大家目力所及,所看到的是123级缓存,看这有什么,运行的速度越来越快,也就说一台笔记本电脑,一台台式机,一台服务器摆在你面前,如果是按照这个架构,我们都清楚啊,CPU是运算速度最高最快的,那么接下来CPU运算出来了,需要传递,需要存储,但是。
04:12
由于在数据的计算和存储的时候。CPU的速度是明显高于内存的速度的,那么这样的话,它一分钟算100次,这个一分钟假设只算十次,那么他们两个是不是必然而然不同步啊,这个跑的快,这个跑得慢,那么只好让CPU不停的去等主物理内存的计算和传递,那这样系统的性能是不是急剧下降,那么我们为了拉平这个短板,扯平这个运算速率,所以说我们在CPU和主物理内存之间设置一个缓存,就是红圈这块,那它的作用是这样的。计算机存储呢,从本地硬盘到这块,OK,从下往上,那么一般对应的程序操作就是从数据库查到数据到内存,然后再给CPU计算,那么这个呢,我们首先先明白我们的硬件,那么接下来我们就要推导出从硬件体系和我们所需要知道g mm Java内存模型它有什么关系呢?来吧。
05:09
由于啊,有这么多级缓存是什么概念,CPU和主物理内存的速度是不一致的啊,我们大家都清楚啊,肯定是CPU最快,那么这个时候我们干了一件事,就这样。CPU的运算并不是直接操作内存,而是先把内存里的数据存到什么缓存里面。大家看,这是CPU。这时我们的主物理内存中间有个me SI缓存一致性斜线,那么相当于说CPU比物理内存运算速度要高,要快,两个速率不同步,那么这个时候我们中间找个折中的叫高速缓存,那这个时候因为我们不能让CPU一直等着这个内存呢。对吧,那这个时候资源利用率它没有拉满,所以这个情况下我们就在CPU和主物理内存之间找到了一个折中,写了一个协议叫缓存一致性协议,如果CPU运算速度极快,那么我出来的通道先放在高速缓存里面,你相当于我的一个秘书,再去跟主物理内存去沟通。那么由于。
06:12
CPU的速度是快于主内存的,所以就会导致内存的读和写操作的时候就会造成数据不一致啊,那么下面这个为了解决这种问题。第一个我们呢,就在CPU和内存之间设置高速缓存,这在硬件上大家已经看到了,我这块呢三级OK,越多数量越大越好,那么这个时候我们这儿呢,要思考一个问题。这种想法我们需要落地在不同的操作系统,你是微软的Windows,我是Linux,它是苹果笔记本Mac,那么怎么来保证CPU和内存他们的读写一致性都OK呢?所以说我们在Java规范当中就试图抽象出一种内存模型,简称Java memory mode j mm。
07:01
来注意重点屏蔽掉各种硬件和操作系统对内存访问的差异啊,因为大家都清楚三主流的现在三大操作系统肯定他们的CPU时钟调度、内存缓存的分布策略是不一样的,但不管怎么说,我们现在同样一套程序移植过来,你在苹果上跑成这样,我在linu上面也希望你跑成这样,最好不要出现太大的插件对吧?也就是希望屏蔽掉各种硬件和操作系统的内存访问插件。想达到的目的,让Java程序在各个平台下都能达到一致的注意内存访问效果OK,解决CPU处理速度快过主内存这样的速度,那么所以我们设定了一种规范叫GMM,说简单一句话。左边这个人假设他是个广东人,说粤语,右边这个人假设呢,他是一个四川人,说的是。川普,那么这个时候大家清楚了,如果各自为战,粤语和四川。
08:02
当地方言去沟通,两者绝对是鸡同鸭讲,那么自然而然,是不是这个访问差异就会出现,那么我们为了取个折中,在两者之间。不一样的地方,要把你们求同存异变成一样,此时我们呢,在CPU和内存设了高速缓存。啊123刚才看到,那么此时我们在这个广东人和这个四川人之间,两个都别说。发言了,大家约定好都说普通话,国语,那么有这么一套一致性协议,比方说我们的国语,那么是不是就保证了两个不同地方的人能够听懂对方说什么?因为我们是不是作为一个大一统的民族?书同文,车同轨,基本上不会产生鸡同鸭讲的这样尴尬的局面,只要你从小到大受过国语普通话的训练,知道中文和拼音,对吧?所以说他只得到了我们为什么需要GMM,就为了解决一屏蔽底层操作系统和硬件的插件,有一套内存访问的模型,让CPU。
09:08
和内存可以直接沟通好,那么这个就是我们对从硬件开始对GM做了一个简单的入门级了解,接下来我们来看看他涉及到的学术上的了解。
我来说两句