00:00
下边咱们来给大家举一个这个方法区的一个内存溢出的一个例子啊,也就我们说的叫OM,那这个例子的话我们要举,那就意味着呢,咱们呃,想把这个方法区的空间给大家占满是吧,那样占满的话呢,我们就得知道这个方法区呢,主要放的是什么数据,诶咱们下边呢,重点要讲的是这个内容啊,提前了咱们给大家说清楚,就是说咱方法区呢,主要放的就是这个类型信息,也就说呢,我们加载的类呢,其实都是放在我们这个方法区的。啊,那咱们要想呢,让它出现这个OM,咱们可以呢,通过比如说反射的方式,动态的生成大量的类,对吧?嗯,把这个类呢,都加载到咱们这个方法区,就会导致呢,咱们这个对空间呢有一个溢出,这是一个思路是吧?诶你看我这块呢,诶拿着这个代码相对来说看的比较简洁一些,这呢是咱们后边讲框架的时候呢,用到一个结构啊,Enhancer啊这里边呢,我们不断的去创建这个method intercept,就是方法的一个拦截器这样的这个对象。那相当于是一个匿名实现类的对象了,诶所以这块呢,其实也涉及到不断的去创建这个类啊,这个外处这样一个方式,这呢是深入理解扎va逊尼中的一个例子啊,我这呢就不用这个例子了,诶这呢我也写了一个代码,咱们直接呢来看这个程序OM这里边呢是什么思路呢?诶这呢我们就是直接呢来去创建这个类啊,直接呢去定义这个类啊就是从最初的这种二进制自检码的方式,我们呢去定义这个类,这呢是首先呢获取一个叫class writer,这个呢大家做一个了解就行啊,所以我就没有必要给大家呢一个一的去说明了啊我们这呢创建一个class writer,然后接下来呢,我们去呃创建你对应的这个类,设置它的一个基本信息,那第一个参数呢,哎,相当于呢,是设置的咱们这个一个版本号是吧?诶指明啊,这个相应的一个参数呢,啊以此呢类推,指明这个版本号,我们这呢是1.8。
01:47
啊,因为呢,我们任何一个呃类,它的这个二进制自解码文件当中,它都有它的一个版本,这个咱们后边讲中篇的时候呢,会提到这个问题,这是版本号,然后下边呢,是它这个叫修饰符,呃,目前呢,咱们用的这个叫权限修饰符,是public的,然后接下来呢,是我们这个叫类名。
02:06
啊类名后边呢,我们这有一个哎闹是吧,哎这个闹呢,主要指明是它的一个叫包名。哎,报名在后边呢,是它的一个负类啊,在负类在后边呢,它有实现的这个接口,负类的话呢,我们直接就让它是OBJECT1类就行了,接口呢没有实现,行这个大家呢了解一下,然后呢,我们通过这个获取到的这个呃访问,然后我们得到一个二进制的一个呃字解码,然后通过这个二进制字节码呢,我们来定义相关的这个类就可以了。啊,生成大的class这个实例啊,这个小小写的这个号,大的class实例呢,我们说就对应的一个运营实例,那我们不断的去做添加,这呢我就只有1万次,那就是不是外处了啊,只有一个1万次行,那这个程序呢,我就写好了,写好以后的话呢,我们这儿呢,是用的是1.8的这个版本,那我们现在这个程序呢,也让他在这个1.8当中呢去做一个执行,首先呢看一下我们这块的这个设置呢,是8OK,然后再来看我们这个位置啊,这是18OK行,那咱们呢,选中当前呢要演示的这个叫OM,把这个参数呢,我先全去掉,也就是说呢,我们使用这种叫动态的这个呃方法区,或者叫圆空间啊,此时的话呢,我们先做个执行,这呢一共是1万次。
03:18
那一万四没问题,相当于呢,我们在这个呃圆空间当中,我们呢,一共是加载了或者说呢,就是呃创建并加载了1万个类。啊,这时候呢,这个对公这个圆空间呢,给我们动态的去做了一个扩展,行,那接下来呢,咱们去给他限制一个这个大小,那在八当中我们使用的就是这两个参数。好,我这呢,CTRLV一下,诶这个Meta space size10兆max Meta space size10兆,这个十兆的话呢,是应该能够,呃,不足以乘下我们这个1000个这个类的啊来我们接着来做一个执行。好,此时的话呢,大家就能看到我们这样的一个信息,一共呢,是8531个啊,我控制的还是比较到位的是吧?诶差一点呢,就能够此时呢,我们报的这叫哎auto memory是Meta space,通过这呢,我们也能看到,确实呢,JDK8当中我们用的呢叫圆空间对吧?行,真的是我们说在这个八的场景下,我们是这样来使用的,那如果说呢,你要是想在这个JDK7或者JK6当中去演示这个问题的话啊,六或者是七是吧,都可以演示这个问题的话呢,我们就使用需要使用的是这个参数,但是呢,这个参数呢,你不能直接呢就写在这块,没有别的一个调整,这是不行的,咱们呢,诶上一节的时候是也演示过这个问题是吧,首先呢,调整我们当前这个,哎,它的这个环境啊。
04:35
咱比如说用上这个七吧。可以了啊,七当中用的还是永久带,然后在我们这个run这块啊,打开这个配置,这呢,我们也改成是这个七。然后呢,在这个位置我们CTRLV一下,将咱们这个pro size和max pro呢设置到这儿啊,OK行,然后接下来呢,我们诶这块在执行的时候呢,把这个位置要改一下,我们此时的这个版本号呢,咱们就是个六了,OK行,来我们再做一个执行。
05:07
嗯,这个呢,我就执行完了,执行完了时候呢,这块呢,给我们显示的是1万啊,就是相当于创建成功了是吧,这个是1.6,然后呢,我们这块也是1.6,诶这个问题呢,还没有报出来,相当于我们诶这个七相当于在我们这个七的场景下呢,它是可以盛得下的是吧,那我们再给它改一改,比如说咱们改成是个五兆。哎,那这时候我们再来执行。啊,这时候呢,这个问题爆出来了,行,那这呢只有1000多个,那刚才我们这个呃,十兆的时候呢,应该也是,嗯,刚刚不够,那刚刚够应该是是吧,诶把这个再设置的小点,我们看出这个问题了,这呢报的叫pro space,行啊这呢我们就知道这个情况了啊那这呢,就咱们给大家演示了一下我们这个方法,就呢出现这个OM的这个问题,行那么OM的话呢,咱们把这个堆空间和方法区呢,出现的问题都叫做OM,但是后边这个具体的信息呢,是不一样子的,那咱们在这个开发当中如何去解决这个OM,其实这呢也是咱们下篇呢重点要讲解的,这叫调优的问题。
06:11
啊,重点讲解的调约的问题,那既然呢,咱们说到这儿了,稍微呢,给大家拓展一下,咱们看一看,如果遇到这个OM以后呢,我们该如何去解决。首先这个OM呢,不同于咱们开发中遇到的,比如说叫呃什么什么exception啊,控制人异常啊等等,那这些呢,是我们需要去改代码的,那遇到这个OM呢,有可能我们程序呢是没有问题,但是呢,我们内存空间呢溢出了怎么办?来看一下,呃,这个时候呢,OM呢,其实一方面呢是堆空间,另外一方面呢,就叫做圆空间了啊,但是更多的时候我们开发中遇到的OM呢,其实都是这个堆空间爆出来的。那要想分析这个OM,我们首先呢,需要导出来啊,你这个快照是吧,就是我们整个的执行过程当中,你各个内存使用情况的一个快照,这个我们通常叫做damp文件,然后这个damp文件呢,我们使用相关的一些工具,比如说eclips中的MAT,哎包括呢,咱们说的这个JVM,哎包括呢,我们还有这个叫啊j profile是吧,等等这样的一些工具,这些工具呢,我们可以把这个弹文件呢给它导进去。
07:11
分析呢,这个大MP文件到底呢,是出现了内存的泄露还是内存的溢出啊,当然内存溢出我们这里就OM了是吧?哎,这个就主要呢,就是看一下有没有存在这个内存泄露的问题,那怎么才算叫内存泄露啊,在咱们Java当中,哎在咱们Java中这叫内存泄露,比如说这就叫占,这是叫堆是吧,在堆里边我们放了个对象,那如果这个对象呢,没有任何引用指向它了,这个时候呢,我们直接呢调JC就可以了,就说白了就把它就回收掉了,那现在的问题是什么呀?咱们呢,诶存在着这个引用的指向它。比如我这呢,直接用站里边来吃香了,也有可能是不是站里边的啊,那直接呢,我们站里边有个引用呢,指向这个区域了,但是这个数据啊,咱们后期呢,也不再使用了。也不再使用了,但是呢,它始终呢,是跟我们这个GC root呢有过关联,所以导致呢,我们这个对象呢,始终呢不能够被回收,那这样的对象一旦多了以后呢,首先说它就是内存泄露是吧,一旦多了以后呢,就造成了我们的内存的溢出,就是出现了这个OM,所以我们首先要定位的就是说是不是在我们整个这个过程当中,存在着这个内存泄露的这些对象,那么这些对象呢,咱们要把它找出来,然后呢,及时的把这个这个指针给它断掉是吧?诶它就不存在这个内存泄漏的问题了,那如何呢去分析呢?诶我们需要呢,使用这个相关的工具,就是我们上面提到这个itt的工具。
08:29
啊媒的工具或者呢,我们叫JVSOVM,或者说诶j profile等等,那查看一下我们这个对象呢,到JC这个引用链,然后掌握这个对象的这个类型信息,看看呢,这里里边呢,是不是存在呢,确实有一些泄露的代码啊有些对象呢是不用的,但是呢,还有关联,我们及时的把这个关联呢,给它这个处理掉是吧?行,这是一个,那如果呢,要是不存在这个内存泄露,那你没有内存泄露的话呢,那就是纯粹的是不是叫OM了。啊,就是因为对象太多了,那怎么办呀,两个方面要想不出现OM,要么呢,你就是把这个相应的这个内存空间呢,要调大,你看是堆出现的,还是我们方法去出现的,后边不有这个冒号的详细信息吗?诶那你看一下把这个实际的这个空间呢,可以调的大一些,这是一个方面,那另外一个方面呢,就是由于你这些对象呢,都还要用是吧,所以它还不是一个泄露的问题,那你除了调大的同时呢,看一看这些对象呢,我们生命周期有没有必要呢,给它设置的过长,比如说呢,有些不用静态的,我们就没有必要去静态,有些呢在方法内使用呢,就没有必要呢,给他在方法外呢去声明等等,我们呢去调整适当的一些对象的生命周期,让他及时的进行JC啊,这呢就避免了我们这个在内存空间中占用的时间过长。
09:43
OK,那这个事儿呢,咱们到后边讲这个下篇的时候呢,还要去提,而且呢,也不止我们现在要讲的调优中的这一方面,到时候呢,我们再细节的给大家展开来说,好这呢,咱们给大家举了一个OM的一个例子啊。
我来说两句