00:00
好,那顺着呢,咱们刚才讲的这个设置对空间大小的这个参数之后呢,咱们来讲一个这个OM啊,这呢,我们主要针对的是咱们对空间啊,如果呢,呃,这个存放的这个数据超出了这个堆空间的最大空间设置的话呢,我们就会报一个叫oom啊,它的全称呢叫auto memory error啊,是Java hi space就针对于我们这个堆空间,咱们出现了一个叫内存溢出这样的一个error是吧?这个error的话呢,准确翻译过来呢,我们称为呢叫错误对吧,还有翻译成是个错误啊,那么在面试的时候呢,有时候我们就泛泛的就说说你在这个嗯开发当中遇到过哪些异常呢是吧?这个时候呢,有很多同学就说,诶他问的是异常,问的呢不是我们说的这个错误,这时候呢,就会专门去打那个exception是吧,哎,就会出现这样的情况,这呢我们需要做个说明,那做说明之前呢,咱们先打开一下咱们这个。呃,这个API是吧?哎,通过这呢,咱们说明一下啊,就是整个呢,关于我们Java语言这个异常的这个体系结构呢,咱们有一个比较顶级的一个类,这个类呢称为叫throwable,这个大家应该都很清楚,这个throwable呢,下边有两个具体的子类,一个呢叫做error,一个呢叫做exception,这个exception呢,通常咱们把它呢,哎精确的翻译成呢,叫做异常没问题是吧?而这个error的话呢,我们要翻译的话呢,一般呢都叫做错误行,那么还回到刚才说的这个面试问题,如果问到大家说说你开发中常见的异常有哪些呢?很多同学呢,会想说你问的是异常而不是错误,包括呢,咱们在讲这个Java语言的时候呢,也提到过哈,说异常是异常是吧,不是错误哈,那么很多同学答的时候呢,就说各种各样的异常啊,比如说控制人异常啊,角越界啊,这个class class exception啊,L exception啊等等,说这样的一些异常,那面试官长可能会问你有没有遇到过一些跟内存相关的一些异常?
01:46
啊,这时候呢,同学可能会想到说有战一出是吧,Sta or floww啊,包括OM啊等等,但是这块一想说,诶这呢都是F呀,那我这块是不是不应该说呀,这时候要注意啊,其实面试官呢,已经在引导你去打这个OM了,包括呢战役出这样的问题,那OM的话呢,其实后边呢,参数也有很多种情况,咱们说呢,这叫Java hi space,就刚才看到的只是其中一种,那么还有很多种啊,有一些高级的呢,开发中不太常见的,这个如果你能答出来,而且在什么场景下出现的,能够打好的话呢,这个还是比较出彩的。
02:17
啊,其实面试官呢,在引导你呢,去回答这个错误啊,这里边呢,大家要注意一个问题啊,就是咱们在这个学习这个语言基础的时候呢,我们讲到这个异常说对应的叫exception,这呢咱们可以理解为叫狭义上的一个异常,但是如果呢,平时开发中大家说说这个呃,出现什么场景异常都有哪些啊,或者哎呀,我这个程序出现个异常,这个时候咱们所说的这个异常啊,实际上呢,我们可以理解成广义上的一个异常,这个异常啊,就是理解成凡是程序不正常的情况都叫做异常了,对吧?哎,异于常理嘛,哎,从这个角度来说呢,这个异常呢,其实就相当于是我们的这个RO。哎,也就是说呢,面试官问到说你都遇到过哪些异常,这个时候呢,大家不要局限于说这个exception啊,这个error呢,也是可以说的啊,你要注意这个问题啊,就是这个时候呢,如果你只是说一些exception的话呢,其实这块呢算是一般是吧,比如说定位呢,就是两年开发经验左右的是这种情况,那你要说一些这个异常的这个error弱的问题的话呢,这个我们就奔到三年去了。
03:14
啊,这个是一到两年应该这样说啊,这个呢,呃,两年及以上的,这个你要谈这些高级的error问题啊,答的要好一点,这个呢,就说明你对这个GM啊,这个就更清楚更熟悉一些是吧,那应该是这样的一个情况啊,所以说大家在这个面试的时候啊,或者我们平时说的时候,包括我讲课的时候呢,说哎呀,我们这块出了一个异常叫OM,这时候大家就不要去纠结,说老师你说错了,哎,这是一个error是吧,这个时候的异常我们就是广义上的一个概念,行,那么既然呢,我们这块呢,想演示的是堆空间中出现的一个内存溢出。内存溢出,那就是超出了你堆空间的最大的一个范围是吧,它就溢出了,这呢是占,这是堆,要想保证我们这个堆呢溢出,那其实呢,只需要呢,我们看看什么数据存在堆里边,让这个数据呢,存的是不是超过我们这个堆的,呃,这个可容纳的最大空间不就溢出了吗。
04:04
非常容易的一个非常这个好理解的一个思路,对吧,那么咱们已经提到说这个咱们实际上创建这个对象,哎,包括呢,我们创建这个数组,这个对象和数组的实体呢,就存放在我们这个堆空间中,那言外之意呢,我们就是不是造很多的对象或者是数组,把我们这个堆空间给它撑爆了,就会出现OM,对吧?哎,就是这样个道理,行,那这块呢,我就写了个具体的例子啊,这个例子的话呢,咱们直接打开这个程序就可以了啊,因为这个程序呢,也不不复杂啊,所以呢,直接我就写好了。这呢是这样子的,首先呢,我造一个类,这个类呢叫做picture,生明了一个属性,是用的字节数组,然后呢,这个构造器当中呢,是给我们的个数组呢,做一个初始化来指明它的一个长度,哎,这样子啊哎就好比是模拟一下这个图片呢,底层我们都是用字节来存的,这呢就很多的字节诶,构成的一个字节数组行,然后的话呢,我们在上边这个程序的main方法中造了一个a list,呃,然后接下来呢,创建很多的这个picture,很多的图片,然后呢,这个行参呢,是通过这个呃,实参了,应该是啊,咱们通过这个renome来提供这个随机数啊,这是它的一个上界啊,然后呢,给我们随机确定这个底层的字节数组的一个长度,就是这个图片呢,说白了,就有大的,有小的。
05:14
我们通过一个while处的一个循环,不断的往这里边儿去添加。诶,那添加的话呢,我们知道你真正用的这个对象就在对空间中,然后呢,你这个嗯,对空间中你这个对象的这个属性还是一个字节数组,总之呢,就是这个数据呢,都在我们这个对空间中,如果你要创建的足够多的话呢,就哎把我们这个对空间呢就击爆了是吧?就这个道理行,那这时候呢,我们给他设置一个上限啊,刚刚才我们已经讲过了这个呃,初始的和最大的这个对空间内存的一个设置方式了,直接呢咱们就过来执行啊,首先呢做个编译。好,编译完以后呢,直接我们在这呢做一个参数的添加,指明的是我们这个叫OM啊行往这一放没问题是吧,好这个应用一下啊,OK,好这时候呢,我们做一个执行。
06:01
好,执行起来,这个执行起来以后的话呢,我们这块,嗯,因为有一个这个20毫秒的一个限制,所以呢,不会说马上就能看到这个内存的一个溢出了。对吧,是这个情况啊,然后这块呢,我们这个当然你在这等着的话呢,它一会儿也会出现,咱们可以呢,再看一下这个过程中的一些细节,这个细节的话呢,咱们又要用到一个工具,前面呢,前面呢稍微的给大家也演示过,就是记呃我VM。啊微你看下微是吧,其实这两个音应该都对啊呃,这呢是我们从这个JDK的那个并目录下呢,直接我建立一个快捷方式进来的,当然呢,其实在这个百度上你也可以去搜索一下这个微搜VM啊,去下载一个这个客户端也行,只不过呢,也没必要了,因为呢,我们这个JDK已经内置了这个可视化的一个虚拟机的一个这个环境了啊,双击一下打开。好,打开以后的话呢,这呢就能显示我们当前运行的这些进程,大家看到已经没有我们当前程序了,说明我们这个程序呢,是不是已经执行完毕了,好这呢已经报出来我们这个OM了。对吧,行,那要要能看到的话呢,我们把它呢,再抛起来。
07:05
又起来了,起来以后呢,我们在这儿就能看到这样的一个进程,OM好,双击。诶打开了,打开以后的话呢,我们在这呢,就能看到咱们设置的这个参数啊,这个600兆,然后在这呢,有一个叫诶v o jc在这就我能看到这个细节情况,这里边呢,我们想强调就是这呢是叫老年代,哎这个呢整个呢叫新生代,新生代呢又分成叫伊甸园区,这个S0S1啊这两个区域没问题啊行,然后大家呢,你看到这块我们这个细节的话呢,咱们下一节就来讲这个问题了啊这个细这个伊甸园区的话呢,这个数据不断的去增加,诶然后的话呢,我们这块也提到说一定会有一个性能的区是空的是吧?诶你看这块呢,程序不再走了,是因为我们这块呢已经又又爆了。嗯,又爆了是吧?行,这还得再跑起来啊。把它关掉。哎,在这再打开来,再进来,你看这块这个数据呢,是不是不断的去增加。
08:02
哎,不断增加,然后呢,这个数据呢,这个细节咱们下一节呢就来讲了。啊,直到什么时候我们会报这个OM呢,就是我们这个堆空间一出,主要呢,你看我们这个O区啊已经满了,那这块马上就要超了,然后大家在这块等一下啊。你看这块就爆了。哎,因为我们这里边的O呢,是不是已经满了,再进行JC的话呢,已经没办法再去JC了,因为我们这个里边每一个对象是不是我们都占用着呢,没办法去给大家回收掉是吧?哎,这就报一个对空间的溢出行,那么溢出的原因是什么?正常其实就是我们后边的一个监控了,这个大家可以在咱们的这个位置啊,啊这块停了以后呢。恩,听了以后这块就。就没法看了。啊,实际上我们在这呢,是可以看到它这个原因还是什么的啊嗯,咱们再还得跑一下啊。行是吧,然后打开以后呢,把它打开,就是让大家呢,可以咱们再多了解一下啊,在这个抽样器当中,这有个内存。
09:03
好在这呢,大家能看到就是明显的你能看到我们这个空间,对空间当中到底哪些数据呢,特别多,你看这里边能看到,就我们这个bad数组是不是特别大。哎,这个大的原因是什么呢?就是因为我们不断的去造那个picture picture里边每一个都有一个字节数组啊,这个数组的长度特别大,所以呢,这个堆弈出了以后呢,原因是什么造成的?我们通过这呢,也可以逆着呢去推出来啊做一个分析啊,就这样行,那通过这个呢,我们说一下这个OM,包括呢这个诶我们从这个通过这个可视化的这样的一个VM工具当中,我们看一下这个细节情况。
我来说两句