00:00
好,那么同学们,我们接下来jc overhead垃圾回收上头这个错已经介绍了,那么接下来再介绍一个猛的。干嘛呢?Out of memory arrow的另外一种情况,Director buffer memory。那么也就是什么。直接内存挂了,那么这个东东要明白哈,GVM呢。前面我们讲过这么一个东东,就是space哈。请大家看。云空间这些巴拉巴拉不废话,重要的是这句话,云空间并不在虚拟机当中,也就是说m space跟我们的GPM那个堆内存没关系,而是使用什么内存,本地内存听懂,也就是说。我们原空间的大小理论上是仅受本地内存的限制,就是你硬件上的。那个情况,那么言下之见,他这种情况的意思就是什么?你要这么干的话呢,把你的这个直接内存,也就是上面这个。
01:01
就这个都干翻了,这个故障非常严重的啊,那么。为什么会出现这种故障,为什么以前不出经常出现呢?因为这个故障呢,出现结合于两种技术。干嘛ne TY net那么提过一嘴,更主要我们说过它底层是不是懂不懂,是不是叫NIO。能跟上no blocking IO非主色IO,那么这个时候就会叫新IO java8的新特性,那么呢,杨哥。我们之前复习的时候大大串讲过。主要这个事儿是因为NIO引起的,我们的nat底层就是IO,那么什么意思呢?他情况是这样的啊。那么在这么一个情况哈。那么呢,首先我们写IO程序的时候呢。干嘛经常会使用字节buff法来读取或写数据,这呢是一种基于通道和缓冲区的意思啊,那么这个时候在字节B法的获得当中的话呢,我们有两个方法,一个叫AOC,是不是分配的意思啊,这个就是看嘛,可以使用native函数库直接分配什么内存,对Y内存就是不在GM里,我不跟你一块填,我另外开一块天地。
02:16
那么也就是通过一个存储在Java堆里面的de尔塔buff法的对象作为这块引用,那么也就说我这个引用我在GPM里面,但是我那个实例对象我不在GVM里面,那么言下之际,这样呢,性能会好,避免了在Java堆和native堆当中来回复制,那么言下之意,弟兄们,我们以前讲过一个叫alloc。这个东东干嘛分配在什么地方,GVM堆内存属于GC管得着的范围,垃圾回收,垃圾回收我们是不是都是针对GVM的堆啊,99%的情况下。那么但是呢,这样的话会导致Java堆和雷堆当中来回拷贝,所以说速度较慢。那么有时候我们为了提高性能,第一种方式是。
03:02
分配在什么?操作系统的本地内存,那么这种方式呢,干嘛呢?它不属于GC管辖,也就是说我们这儿干嘛。就是这句话。云空间并不在虚拟机当中,而是使用什么内存,本地内存,也就是我们干到我们本地内存里面去,那么这个时候干嘛呢?由于不需要内存的拷贝会很快,那么这个时候呢,如果我们在这儿不断的去分配本地内存堆,内存倒是很少使用,因为我们讲过了干嘛,这个第一种是在GM内存单超。这个应该准确的是,第二种是分配在我们的本地操作系统的本地内存,那么不属于GC管辖,由于不属于GC管辖了,你不停的分配内存,堆内存又很少使用,那么GVM你又不在我这分配,根本就不归我管,所以说这种对象就不会被回收,这个时候就导致什么GVM的堆内存很充足,但是你的本机的这个内存,本地内存可能已经用光了,那么你再次。
04:07
尝试要分配本地内存的时候,就会把OL程序就直接崩溃,这个时候写NIO程序的时候非常要小心,那么当然现在NIO这种技术非阻塞,这样的话呢,肯定了,那么好,首先我们就来看看那杨哥简单,你能不能讲人话,用两句话给我讲明白。第一句就是分配在哪,以前我们整个对象都是分配在GVM的对应内存当中,那么导致GC收我就是收GVM的。堆内存里面的内容,但是现在不带了,他不带分配在gbm的堆内存,如果我们用这样的方法,它是分配在什么地方,分配在。操作系统的本地内存不属于GC管辖的范围,那么如果你在这儿干嘛,也就说在本地内存里面不停的去,你有对象。那GVM的堆内存倒是够用,但是外面满了,那么这个时候干嘛?由于GVM的堆内存够用,它根本就不会启动GC,那么这个时候就会导致是么?GVM的堆内存是好好的,说不穿了,就是这个GVM好好的,但是你本地的这个内存那已经用光了,直接导致什么啊,程序崩溃了。
05:19
也就是说你这个对象并没有扭在堆里面,你是扭在了什么外面,那么好处是什么,你直接跟外面的物理内存打交道,那么这样的话是不是速度会更快,那么好,这是第一步,那么第二步我怎么知道那杨哥什么叫本地内存啊?说穿了就是你物理内存GVM外面默认能用的最大内存是多少?那么我们讲过什么都不配的话,默认是多少?1/4,那么我怎么能看到或获得我们的什么?本地内存现在初始值是多大呢?这个每个人的机器不一样,你是4G,你是8G,你是16G的内存不同,但是方法如下。
06:00
找到我们的Java安装包,像杨哥是D盘Java加一运行环境有个力,这个力下面是不是有个RT点价,我们讲过了,这个RT是runtime点价,要加载哪些东西啊,什么string object。通通放到我们的什么圆空间,保证Java一开始的时候就能用,那么在这个里面会有一个东东,那么大家看。你们干嘛呢?三。迈克在这有个叫VM.class这么一个类,那么所以说我们来看它的程序。第一行就这么写,我这以前我讲过,我就把我讲过的我就不再挑了,直接写这个是调底层的RT点价包里面的Java底层函数,这么说能跟上,那么我们现在大家请看,那么这个什么direct b法这个类,那么同学们请看干嘛?Direct buffer这个里面虚拟机参数一个都没添加过,OK,我们干什么,我们那就。
07:01
速速的来一次,那么言下之意就是初始配置的最大直接内存,你可以把单独就是我的本地内存,Java虚拟机,我本地内存是16G,那么Java能用到多少?那么这个时候同学们请看。多少?3605点兆,大概是不是四个G,那么是不是就是我16G内存的1/4能跟上,那么所以说这个最大的直接内存,也就是我的本地内存GPM,现在能碰得到的就是四个G,那么言下之意。就是说如果我用这样的一种方法,不停的在这四个就是在堆外面,也就是在我们的直接内存这个范围里面。GVM堆外面,但是在我画个图啊同学们,那么这块有些同学呢,跟上哈,这块有点难理解,没见过的新故障。首先这是我们的物理内存能跟上,假设就是四个G 16g的1/4,是不是4G就这么大块,现在呢你呢给我呢切了这么一块,比方说这个颜色就是蓝框框,这个里面的,我们就把它叫做什么GVM,一般我们把它叫做堆内存。
08:11
听懂了吗?那么言下支线就是弟兄们,我们以前讲NIO的时候,假设你用这种来分配对象。那么这个时候。这货这个方法干嘛。它就分配在堆里面,属于GC管辖的范围,那么言下之意,如果你用这种方法,AOC是分配的意思啊,分配了一些对象的大小,慢慢的堆空间大了,那么在这块就能有GC。挺和谐,不会出事,但是他有个不好说,是需要拷贝,所以速度相对较慢,那么言下之间,我们现在就不在GVM里面干,我们在哪干,我们就在。堆内存以外,但是物理内存以内,在这块,就是我现在红色线画的这块,也就说在蓝框框以外。
09:01
黑框框以内的这块我们来进行尿,那么我们用的方法是什么?是这货,那么在这货来拗的过程当中,我们会出现一种什么样的好处呢?也就是说假设我们在外面这个六啊。来。那么这个时候我们就在外面。好处是什么呢?是分配OS的本地内存不属于GC管辖,那么也就说我用在堆内存的外面,那么呢,我直接呢,就不用像以前一样的堆内和堆外,我直接在堆外面,但是物理内存之之间这样去干,是不是不用拷贝,我们讲过NIO,那么言下之意,这一块外面就是蓝框框以外,黑框框以内的不属于GC管。那么这个时候如果我在这儿不停的干嘛,你有对象把这一块。G面,它赖以生存,外面的物理内存,直接内存都干崩了。不用多讲干嘛,整个GPM是不是也就崩了,很简单的,你们家住八楼,现在呢,一楼这个地基塌了,地基部分,那你八楼是不是也就挂了。
10:10
OK,那么好,那么我们怎么办呢?第一个,由于现在杨哥的这一行代码,我这个最大的直接内存是多大,现在接近是不是那么大,如果我去分配内存,将会去等很长时间,那么为了让大家看到效果,我故意使坏,那么这个时候是不是让它变小一点,然后再用这个方法去扭对象,那么这样的话呢,干嘛是不是就容易获得这个效果好,那么这个时候干嘛呢?我们呢,直接两行代码,我节约时间,我们多的。说那么现在节约时间,我就不再手敲了,因为这个我们讲刚才有时候讲过。那么言下之间,在这块我要干一件什么事呢?首先,堆内存。十兆,但是呢,默认我能用的物理内存是这么多,我不用那么多,我只用多少,我故意把它变小,就相当于说现在这个黑框框,我把它变窄。
11:07
那么这个时候干嘛,没有那么大的空间,我又不停的用这个方法在干嘛,对外这个直接内存这尿。它只有多大五兆,那么分分钟是不是就把它给撑爆了,那么这个时候同学们请看,直接是。A location directory在直接内存那分,那么言下之意就是在我们这儿的这个蓝框框以外,黑框框以内来进行分配。不动那么多大,3600多兆,现在杨哥故意使唤把它缩大多少五兆,我只有五兆,你要六个多少,你要六个六兆,那么这个时候是不是直接在产势分配的时候OM干嘛?程序崩溃,好,那么这个再写ninety,写NIO的时候,这个方法要小心,说穿了用这个方法,你最好先用这个方法看看你本地的直接内存。扛不扛得住,好,那么这个时候过来。
12:01
来,同学们。十兆十兆最内存,看看这个GC的打印。这个日志,然后最大的对应内存,我们从多少3000多,我把它降到了多少五兆,那么这个时候同学们你懂的,三行代码很简单,那么第一行干嘛?直接获得了初始值3000。多兆,然后呢,停一个三秒钟,然后干嘛,主要是为了让大家看到这个效果听懂,否则它分配的太快,没看到效果,那么之后我们要分配只有五兆,大家看我呢。六兆。那么。这样是不是撑爆了?好,那么同学们,我们来看一下这个效果。同学们,什么情况,你看?配置的最大的多少,现在。我们这个系统来独立后多少是不是只给五兆,那么你现在不停的不停的收收收收收,那么干嘛?最终我们直接物理内存,那么大家可以看一眼me space这干嘛。
13:07
GC前GC后看不动了,那么所以说干嘛这个时候你要这么分配,OK,我就给你报了这么一个oom的故障现象,那么这个故障现象你要注意我就不粘了,在这好像粘过了干嘛呢。一般在做NIO程序的时候,经常出现,如果面试考官来考你同学有没有知知不知道什么叫直接内存溢出,就是director buffer memory,那么这个时候说明什么,他想问你的是什么?NIO程序就看你有没有看到一个故障,它就知道你有没有写过IO程序倒过来考你,那么所以说你可以看得出,现在你要想拿一万五左右的高薪,大厂考的面试题,大厂他对知识的深度、广度的要求。越来越多,越来越高,那么这个时候干嘛?还是杨哥那句话,不要天天只知道一个增上改查,哎呀,坦白讲,这个都是头两个月的技术,到最后你把杨哥给灭了,坦白讲,进个大厂,找一份好的工作。
14:09
应该是没有什么太多的问题,好,那么大家呢,咬咬牙,咱们呢,继续来学习,这个异常很重要。反映了你是否知道NIO,好,那么同学们这个异常就给大家介绍到这儿。
我来说两句