00:00
那我们来看一下flink,呃,其关于内存相关的一些概念啊,咱们要呃做一个认识啊,认识他一下,首先它内存是怎么存储的结构啊,啊,刚才模型我们知道了啊,它有一个。专业词叫内存段啊。在弗link内,内部叫做memory sga。这个也是一个特有名词啊,我希望大家能够记住这个名字,对吧?这是一个最小的内存分配单元,默认多大三12KB,那么第一句话啊,是大家要了解的,必须要了解的啊。加速啊,那么这个东西我们说了flink那时候是不是用了堆内跟堆外啊啊,所以这个最小单元它是不区分堆上还是堆外的,它既可以是堆上的,也可以是对外啊,相当于说这是它抽象出来的一个东西,一个类型抽象出来。
01:01
呃,那如果是堆上呢,它怎么存呢?它存的是一个字节数组字节数,那么堆外呢。对外用在哪里啊,主要是在管理内存。啊,不是那个网络缓冲区对吧?哎。提供二进制数据读取方法,那么大家记得咱们写拉姆达的时候。比如说map拉用拉达写法,是不是有时候要指定啊?原因是什么?Sli有自己的一套类型管理系统啊,叫什么type。Information。Type information。这个应该讲过吧,对吧?啊inform你看就是这个类,然后CTRL加H,你看它封装了这么多个类型,那至于刚才有同学讲的什么。
02:00
呃。Type是点什么,这个其实底层调用的是不是这个对吧?啊,这个是方便我们使用的一个API而已啊。所以他存的时候是以二进制。啊,不就对一个字节数组不就二进制的嘛,是吧。啊,然后呢。我们有一些序列化器啊,反序列化器它是提供的,不用我们去管,说白了不用我们管啊。好,那我们回到这个概念,内存段memory sIgMa这个东西它有两种实现啊,这边有一个内图继承结构。它是一个抽象类,有两种,一种叫只使用堆的,一种叫。混合的啊,那第一种当然是只用来分配堆上了,另外一种既是堆外堆上都用,那么目前呢,咱们主要用哪个?是不是这个是不是混合的,对吧,混合的。
03:03
混合的杂种混血对吧,啊混血。就这么写的话对不对啊,来咱们以一个案例来讲一讲,他有什么优点,他为什么要设计这个抽象来假设咱们有一个TOP3的数据,第一个元素是int类型,第二个是double类型,第三个person类型,Person是不是一个对象?还记得如果是Java jm自己管理。它每一个属性是不可能有各种各样的问题啊。啊,比如说是不是密度不紧凑啊,是不是散裂的对吧,那我们内存段它不闪裂,它你看是紧密连在一起的。是紧密连在一起的啊。这是一个内存段啊,这是一个内存段,好,我们看一下这分别对应三个元素来硬的类型,In的类型,需要几字节啊,哎,这边给他四字节,Double类型几字节啊,八字节好给你八个,好接下来是不是一个对象,那么对象咱们是不是存了很多信息啊。
04:12
诶,首先是。这个是什么?说白了是它的一个引用啊,对不对,好,那接下来是不是对对象同嘛,哎,来接下来你看。这个对象是包含了两个属性啊,那两个属性是不是分别要占用一定的空间啊?ID是int,要四个。使俊要八个。啊,可变的对吧,看你是对多长对吧?啊,差点说错了啊,那你看整体来讲,整个table包括对象也好,它是不是很紧凑的在一块啊,这就是他抽象这个内存段的目的啊,这样的话就避免了咱们开头讲的几个问题,它存储很紧密啊,很紧密,那这样使用效率是不是就高多了呀,对吧,高多了,当然他存的时候需要怎么样。
05:06
序列化,序列化什么作用是把数据序列化成二进制啊,对吧?哎,所以我们说是这个对吧,那就联系起来了,好,这是一个概念,再了解另外一个内存页。内存页其实是他更高一层的封装啊,你想想咱们一个页面里面,比如说写文章是不是有很多的段落呀,是不是啊那。一段一段的段落就对应一个内存段,那么一个一页就带对应一个内存页,那是不是更高一层的一个封装啊,对吧,更高的一层封装,你看这个内存页呢,是内存段之上的一个封装啊,那么读取。跟写入它分别封装了两种对吧,叫什么什么view对吧,页码对吧,视图嘛,输入就是输入页,输出就输出页啊。
06:06
啊,有了这个有什么好处啊,咱们是不用关心这一段是第几段对不对,咱们只需要关注第几页就行了吧,是不是关操心的少一点了。对吧?那比如说你看一本小说,在中间某某一段,你要数出这一个段落是从第一页从头开始到现在第几个段落,是不是很费劲啊?是不是,但是如果你算它是第几页的,是不是就很方便了,对吧,而且你还有目录对吧?哎,这是一个内存页啊,为了方便一个操作和管理对吧?内存段的事啊,内存段的事咱们就不用关心了,对吧?咱们关心这个页就可以了,好,这是这个概念,还有一个概念叫buffer。Buffer在哪里呀?是不是网络缓冲内存啊,我们说这边是不是用来数据传输的时候会用到的呀?啊这边我们叫它八缓冲嘛,缓冲啊,那注意申请跟释放由我们代码指定吗。
07:10
自行管理,自行管理,那么实线内演熟一下就行了,叫net buff分啊ne buff。那么这个东西呢。大家注意,一个八分对应一个。内存段啊,一个B本对应一个内存段,那么它同时我们说数据传输是基于什么呢。啊,网络对吧,那这个网络是基于什么呢?Na,对吧?啊,所以你在这个buffer这个类里面,你能找到这么一个。抽象内这个呢,就是net的实现对吧,具体细节在这个里面啊,这个里面。啊,我们瞅一眼这个类吧,讲那么多啊,CTRL加粘贴回车。你看他是不是继承了这个东西啊,实现了buffer呀,对吧?啊,那这个东西呢,就是netty的一些实现逻辑在这里面啊,那你看它的一个成员变量,一个属性是不是叫内存断了。
08:12
啊,我们说一个包含一个对吧。好,那这个没啥,就介绍一下概念,还有一个资源池。资源池,那他是来干嘛的,咱们不是有八份吗?有缓冲嘛,对吧,那么就像咱们连接池一样,咱们比如说连接my circlel,创建一次连接,是不是一个连接对象一个线程啊,但我们通常是不是用一个连接池来管理啊,是不是?哎,没错,就是这个东西连接池啊。那它就是用来管理buffer的,包括它的申请释放销毁啊,就跟连接池是一样的作用,对吧,只不过它管理的是buffer好。那咱们的具体实现是一个叫logo开头的啊。
09:00
Logo开头大家注意这句话啊,大家要记得就这一句。每个task自己有一个local buffer buffer。好了,呃,那么后面呢,这一段大家可看可不看,就是这个池子怎么创建呢?我们说他用了一个工厂。你知道有一个工厂就可以了,好吧。那这个是咱们的内存数据。
我来说两句