00:01
到现在有有问题的吗?还是比较简单的吧,对吧?那么接下来呢,咱们说一个特别的注意听啊,我们说NIO是不是能提高效率啊,怎么提高的,就是接下来要讲的五那么什么呢叫做直接缓冲区域,非直接缓冲区,我们先说说什么叫做非直接缓冲区呢?非直接缓冲区对吧?缓冲区这个非直接缓冲区它通过叫做a loate a loate的方法是分配的大小啊,分配缓冲区是吧?也就是刚才咱们用的时候的非直接缓冲区,它是什么意思啊,它是将缓冲区建立块叫做gdm的内存中,在这个非直接缓冲区,它是将这个缓冲区建立在GM的内存中嘛,对吧,GM内中那么相应的。
01:01
那什么叫做直接缓冲区呢?直接缓冲区通过叫做a look at,叫做direct e,对吧,D lct direct的方法叫做分配,叫做直接缓冲区,那这种直接缓冲区的区别在于它可以将缓冲区建立在操作系统的物理内存中,这就是区别,那么我们说你要是把缓冲区直接建立到了操作系统的内存中,那我们说在某种情下能不能提高效率就可以提高效率对吧?说在某种情况下那是可以提高效率,那么接下来我们就开始考虑说凭啥创建在物理内存中就能提高效率了,咱们是不是得分析分析啊,对吧?说为什么呢?注意过来啊,形成这个非常重要呢,那么这个时候呢,我们说下什么叫直接缓冲区,非直接缓冲区对吧?看这。
02:01
但是记这是我们的API上对直接与非直接缓冲区的一个详细介绍,对吧?这API上都写了,大家是不是有空去读一读就可以了啊,对吧,咱们完看去理解,那么呢,我们说先看非直接缓冲区,我们说呢,以原来包括我们现在写的这些,如果是非非接缓冲区的话,我们说传统的IO,包括我们刚才建的这个缓冲区,它都是用的这种方式,我们说我们应用程序和磁盘数据或者磁盘文件之间,说要来一个数据的存储啊,对吧,要不然建立IO流是不要不然建立通道啊,对吧,要不然建立通道,但是呢,我们说我们呢,应用程序和磁盘之间,它们的之间传输数据,它们是没有办法直接进行传输的。那么出于操作系统安全的考虑,他是得经历这么几个过程啊,对吧,说什么过程,比如说比如说我们的应用程序是不需操作系统发起了一个读数据的请求,说白了就是我们招应用程序底层调用read的吧,是不是底层是不是面对的人家操作系统的IO接口啊,这个回头咱们稍微的了解一下啊,我们就当我们应用程序要读取这个磁盘中数据的时候,我们首先招应用程序向磁盘数发起的,或者说向操作系统发起的是不是一个RA的请求啊,那么这个时候呢,我们说磁盘中的数据啊,它没有办法直接传输到我们应用程序当中,它会经历这么几个过程,首先它会把这些数据首先先读到一个叫做内核地址空间中,注意中间是不是有根线呢?左边是OS,指的是操作系统,右边是我们的GVMV,呃。
03:50
这个怎么改呢?叫做OS对吧,这个叫做GVM,听明白对吧,中间这些性格上啊,我们当了应求线,算成这种图发小的图形轴,首先说数据不能直接传输啊,它首先是把这些数据啊,先读到内核地址空间中,至于什么是内核地址空间,咱们是不用多多管的,对吧?咱们又不是搞操作系统的,他首先读到内核地址空间中,是不是内核地址空间的缓存中啊,然后还来了一个什么呢?这个copy是不是数据的复制啊,它会把内核地址空间的数据copy回到我的用户地址空间,说白了就是我们的gbm的内存吧,Copy回到了用户地址空间中,然后再把这个数据这个读到我们的应用程序中来。
04:43
能听懂吧,我们说数据是没办法直接传输,它是不是得经过这么几个过程啊,那么相应的反过来,反过来,如果说我们应用程序中有一些数据想要写到磁盘中去呢,那么首先他写哪呢?他们把这些数据先写到用户地址空间中啊,然在在用户地址空间中是不是来到copy呀,是一模一样的数据再复制到内核地址空间中啊,然后再在内核地址空间中再写到磁盘中去吧,对不对?那么你们觉得在这个过程当中有没有一个。
05:22
麻这的地方哪说中间就开呀,我觉得这种开说完全没必要啊,第吧,一年一用的数据,你说还得来回来去copy一次啊,对吧,那这个copy它是完全没有必要,它还得来一个复制,我们说传统的IO,以及咱们刚才写的是不是通过aock的创建的非直接缓冲区啊,对吧,都是这种方式,那么于是呢,在Java n IO中,它提出了一种什么呢?叫做内存映射文件,也就叫做直接缓冲区,它怎么搞呢?它在这个内存内,空间和物,呃,这个用物地址空间之间,也就是说在物理内存中直接开辟了一个缓冲区,也就是说我们这个缓冲区是直接建立在操作系统的物理内存中。
06:17
对吧,说专业的称它为内存页啊什么的,咱们是不是不用托管,你就知道它是不是在物理内存中,在操作系统呢?物理内存中那也就意味着什么呢?意味着当我们应用程序有数据,是不是直接面对缓冲区啊,对吧?那这个物理内存中的这个缓冲区是不是直接面对的是磁盘呢?因此中间的这个copy的步骤就省了。是吧,因此我们说中间呢,省了这么一个空的过程,所以说我们说这种直接缓冲区,它能不能提高一些效率啊,它通过这种方式提高的效率。中间所省去的copy的步骤啊,然后我们说应用我们GPM是不是直接把这个缓冲区建立到了操作系统的物理内存中,对吧?然后呢,不管是磁盘还是我们的应用程序,直接面对这个这个内存中的缓冲区即可,中间的这个copy就可省略了,利用这种方式提高的效率。
07:18
当然我们说这种方式它能提高效率,但是呢,呃,一个是不安全,它对就是不安全,对吧,它还有些弊端是什么呢?弊端就是我们说如果我们在应用程区中开辟这么一个缓冲区,它耗费的资源消耗大不大,对吧?你说你直接把这个内存,这个缓冲器直能建立到物理内存中啊,那它消耗的时候明显比我们自己程序中建一个消耗要大呀,对吧,它的消耗是比较大的,并且还有一个很关键的一点是什么呢?就是说如果当我们账号应用程序把数据写到了这个映射文件中以后,这个文件里的数据就不归我们所管了。
08:02
我们就管不了了是不是?至于这里边的数据什么时候写到磁盘中去,那就是完全由人家操作系统去控制。是能听懂吧,对吧,也就是说当我们把这个数据直接写到这个内存映射文件中以后,这里边的数据就完全由操作系统控制,我们已经管不了了。那就有一有一种情况是什么呢?它首先它分配和销毁耗费的资源是不是就很大呀,对吧?那有的时候呢,我们说那他什么时候才能被销毁呢?也就是说他得等我们垃圾回收机制释放,我们这头引用是不是才能与它断开啊,垃圾回收机制是不是释放它呀,我们这条引用才能与它断开一个连接,得通过垃圾回收机制去释放,那么我们说垃圾回收机制什么时候运行,我们知道吗?我们可用表吗?但是我们有个方法是六线C不就C,它可以干嘛呢?说加快垃圾回流机制运行啊,但是垃圾回流机会立即运行是不是依然不会啊,对吧?所以说这种方式效在某种情况下效率高是高,但是是不是也存在一些风险呢?首先它分配销毁消耗的资源是不是就挺大的呀,对吧,再。
09:25
一个我们是不易控制是不易控制啊,对吧,不太容易控制,除非有一些什么情况在不用这种方式呢?比如说你有一些数据对吧,能长时间让他在内存中进行操作的话,我们是不是可以使用这种方式啊,对吧?或者说有一些大量的大数据对吧,你不想在我们的GPM内存中去开P空间的话,你是不是也可以把它放这来对吧?那就是这个意思啊,能区分开直接缓冲区和非直接缓冲区了吗?对吧?GPM看刚刚我们说API上给他介绍咱这就行了,说当虚拟机对吧,说在每次调用基础操作系统的一个本机IO操作之前,或者是之后,虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中,或从中间缓冲区中复制内容,说白了是不是就是减少了内部复制,减少了内部复制啊,当然呢,怎么说它是不是也有一些风险呢,对吧。
10:25
说不会造成的系统崩溃,那你要是太大了的话,那你说它造耗费你的内存不,那你内存要是长时间被买负荷应用的话,那最终是不是也有可能啊,是不是也有可能对吧?我们不断的往内存中去加加大文件对吧?让他这个你的操作系统内存满负荷的被我们占用着,一会儿我们可以演示一下对吧,对吧,死机倒是不至于,但是当然我们操作演示呢,倒不是让它死机,但是的话,如果我们长时间的对吧,然后大量的占用你的内存,占用你的资源,那是就有可能啊对吧,也是有可能啊好了,那么这个呢,刚才我们说是不是通过a look at direct是不是可以获取直接回路去啊,叫做TEST3,那就来个叫做farer a BA ba8分点上叫做AOC,是不是有两方法呀,对吧,叫做direct,我们也可以就可以创建直接缓。
11:25
冲区,它会给我得到一个BA buff分,这就叫做创建,叫做分配直接缓冲区,听懂吗?咱们可以稍微的搂一眼,说这种创建直接缓冲区和非直接缓冲区区别在哪?我们点进去时看到源码稍微啊对吧,点进去说这叫A,这叫非直接缓冲区吧,我们每次创建这叫hit by buffer,这叫做是不是叫做堆呀,这是堆呀,对吧?它是不是在堆,意思是我这个方法在内存开开辟空间呢?那么是在堆开辟空间,说白了是不是就是数组,说完了是不就是数组啊对吧?往上看是不就是数组对吧?那这个是我们说这是非直接缓冲区,那再看这个aocate direct呢,进去看对吧?这是不是叫做直接by power带进去看,注意看你就看这就行了,它就调用哪哪是吧,调用直接内存页是吧,是不直接调用内存页啊对吧,点进去是不是就看不了了对吧。
12:25
那他直接上操作系统上给你开通缓冲区去了,开完了之后我们也管不了太多,好了,那这就叫做直接缓冲区域,非直接缓冲区域,到后边呢,我们学了通道以后,咱们有另外一种获取直接缓冲区的方式,叫做内存映射文件,到一会咱们讲通道的时候再说,那么现在呢,有一个方法可以判断你的这个缓冲区是直接缓冲区还是非直接缓冲区,通过什么呢?通过BF点有个叫做is direct,可以判断是不是直接缓冲区一直行,这叫直接缓冲区,把这个去掉呢,再去右键运行,这做false,是不是非直接缓冲区啊,对吧?那么以上就是缓冲区域中的一些基本操作了,能不能定缓冲区,正确的存储区线是不是差不出来啊,对吧,好了,F。
我来说两句