00:00
那在讲完这个对象相关的那个内容之后啊,咱们给大家呢再讲一个章节,这个章节呢,称为叫直接内存,诶这个章节的内容相对来说比较少一些啊,整个来说呢,也是需要大家了解一下就可以了,那为什么咱们要讲这个直接内存叫做direct memory呢?那主要原因呢,还是因为咱们在JDK8的时候呢,咱们引入了叫metapace是吧?哎,称为呢叫原空间,而这个原空间啊,咱们使用的就是本地的直接内存,所以呢,呃,基于这个原因,咱们来讲一下这个叫直内存。啊,这样子的好,首先我们来看一下关于这个直接内存概述的几个描述,那首先呢,提到说直接内存啊,它不是虚拟机运行时数据区的一部分。哎,也不是Java虚拟拟规范中定义的一个内存区,这个呢,应该大家是非常明确的,对吧,那咱们前面呢,讲整个这个Java虚拟拟这个架构图的时候,那运行式数据区就只有我们这里边提到的这五部分是没有专门讲到说这个叫直接内存的啊,诶这个大家注意,就这呢是咱们虚拟机内存的一个概念,当然这个概念的话呢,为什么现在既然你不属于我们这个,呃,这个Java虚拟机规范里边运用数据区也呢,不包含在咱们的Java虚拟机规范里边是吧?在这个规范里边,你看运行数据区这块呢,也没有包含着说这个直接内存,那为什么要讲,就是咱们提到了在JDK8的时候呢,我们这个方法区它的具体落地实现啊,这个原空间就是用的本地内存啊,仅仅是因为这个原因呢,咱们把这个内容呢,给大家呢,做一个介绍啊,这个大家首先清楚,然后呢,我们说到这个直接内存啊,是Java堆外的啊,直接向系统申请的一个内存,申请的一个内存区域。
01:38
啊,直接向系统申请的,然后它呢是来源于NIO,这个呢,就相当于是我们Java呢,最初的时候,呃,这个从什么时候开始使用这个本地内存了,其实呢,是在原空间之前呢,咱们讲这个NL的时候呢,就涉及到过这个NL呢,是在JDK1.4的时候呢引入的,在JDK一点升的七的时候呢,又引入了叫NO2,相当于是对原来的ni呢进行了一些这个更新,比如说file啊,Pass啊,这些API的一些加入啊是这样子的,那我们呢,就可以通过存在一堆当中呢,叫direct by buffer,哎,这个呢叫缓冲区来操作呢,咱们的本地内存。
02:16
应该就是通过这样的一个类啊来实现的。OK,那么关于这个NIO,大家呢,在开发当中肯定也都接触过啊,这呢,咱们简单的来对比一下这个IO和NIO啊这个一说呢,大家就能明白啊,这个IO的话呢,这是咱们最初的讲如何实现这个数据传输的一种规范是吧?啊相关的一些API,然后呢,接下来我们引入了叫NIO,在GT1.4当中,那NIO呢,我们翻译呢,可以是这样来翻译啊,一方面呢,可以理解成呢叫new IO,就相当于是一套新的文件传输的方式啊,数据传输方式标准,那另外呢,我们还可以理解成呢,叫做那。Blocking a。那通过这儿呢,你也能看到我们这个NL呢,它是属于叫非阻塞式的,那阳G呢,就是咱们IO呢,属于阻塞式,对吧?那么这个IO里边呢,我们这个有两个比较重要的这个结构,第一个呢,就是我们数据进行这个呃,传输的时候呢,咱们使用的这个基础的这样的一个传输工具啊,是一个字节数组,或者是一个字符数组,那对应呢,就是字节流或者是叫字符流。
03:16
啊,经常呢,讲讲的时候呢,或者咱们这个写代码的时候呢,你把它列解成就是这个快递小哥这个小车一样,对吧,这是它这个小车啊OK,那么我们这个IO的话呢,它是基于流的,所以我们经常称为呢叫IO流啊,基于叫stream,我们创建呢是各种各样的stream流,那这个NL的话呢,相较于这个BA数组或者叫颤音数组呢,它那呢叫做缓冲区啊,叫做buffer啊,当然典型的就是bad buffer是吧,叫缓冲区啊,那么当然这个buffer底层呢,其实还是相应的一些输出结构啊,那么这个NL的话呢,呃,针对于这个stream呢,它这提到了叫做channel。我们称为呢,叫做通道是吧,注意是这个channel啊,你把里N呢,要去一个就成了这个香奈儿了,这个这个注意咱们这个是叫通道,那比如说呢,我们操作本地的这个文件传输的时候呢,用到的叫file channel啊,当然基于网络的话呢,还有我们基于socket项目的这个channel啊行,那这是我们说的这个IO,那么具体呢,在开发当中,大家还有专门基于我们这个NIO,基于它的这个框架啊,Ni体框架是吧?诶这个大家呢,相关在开发中呢,应该有接触,包括呢,我们一些框架的底层在实现数据传输的时候呢,用到的也是这种非阻测试的啊这儿呢,不是我们讲解的重点啊,咱就过了,那么这个NL呢,刚才也提到了,它需要呢,通过叫direct by buffer呢,去操作咱们本地的内存,我这儿呢也对应了一个代码,大家来看一下,这呢我造了一个buffer,呃,当然这只是一个T型的一个变量啊,呃,显示的这个EGB,然后呢,我们通过这个bad buffer呢调一个叫aocate direct,在这个方法底层呢,就帮我们创建了一个呃,直接内存啊,这就使用了我们直接本地内存的这样的一个对象啊,Direct by buff。
04:52
然后这个参数呢,诶这个参数in特型的一个capacity是吧,它影响的是什么呢?就是我们呃在这写了,呃,你创建的这个字节数组的一个长度,这个单位的话呢,是字节。
05:05
所以呢,回过来我们这呢,就这是1GB的啊字节是吧,啊这样的一个情况啊,好,这个呢就比较清楚了,然后我们这儿呢,就直接呢,相当于是占用了一个本地一个GB的空间,哎,然后呢,我们开始释放,看一下这个一个GB呢,是不是能释放得了,就这样一个情况,行,咱们把这个程序呢,给它抛起来。嗯,行已经跑起来了,那此时的话呢,我们是在这个scanner这块呢,实现了一个阻塞是吧,在这阻塞点呢,啊,所以程序呢,就没有继续往下走,然后呢,我们打开这个任务管理器。打开任务管理器以后呢,诶,咱们把它放大一点,这时候大家能看到这里边这个内存的一个占用情况啊,这就相一相应的一个一个的进程,那到底哪个进程是啊,诶咱们也可以是不是打开咱这个CMD是吧。诶,GPS看一下咱们当年运行的这个程序是8352啊,那这块呢,就8352,那这个呢,你看占用的这么大的空间啊,这个空间有多少。
06:01
算一下。注意这呢已经是KB了啊,1068772。哎,除以呢,哎1024。啊,这呢是我们得到这个兆是吧,然后再除以这个1024。OK,那大家在口就看到了,我们占用了是不是一个G,呃,多的一个空间是吧,一个G多的一个空间,实际上呢,就是我们现在呢,占用的这个本地的一个内存啊,一个G多,OK,然后接下来呢,我们下边呢,说这个分配完毕了,请求指示,我们现在正在等待啊,我们说呢,诶释放。啊,内存。好,哎,就现在有点这种手掌的感觉是吧,说队伍检验完毕,请指示是吧?哎,这个释放内存,那这时候呢,就开始去释放内存了,那开始释放内存呢,我们再回过来看一眼,这个时候呢,咱们的8352呢在这儿呢,此时呢,你看它这个占用的是不是明显的就少很多了,20816啊,你再算一下。
07:07
20816,你再除一个1024。啊,然后再除一个1024这个呢,就是对应的这个照比啊,多少多少这个G比啊,G比是吧,然后刚才我们是1.01多,那现在相当于就是把那个一个G的给它去掉了,所以你看此时呢,占用这个内存空间呢,就明显的就减少了。没有问题是吧,哎,那这时候呢,我们这个进程呢,还没有关闭啊,我可以在这儿呢,说一个这个诶关闭是吧。哎,行,这就结束了,OK,那通过这个呢,比较清楚的能看到呢,我们就通过这个叫a locate direct啊它呢直接呢就分配本地的内存空间啊,OK,那这就可以了,好,这呢是我们先说明的第一个问题。
我来说两句