00:00
行,那接下来的话呢,我们就针对于这里边的一个,呃,主要的这样的几个功能呢,咱们进行一个说明,刚才呢,咱们是相当于做了一个概述的一个情况啊,呃,咱们说这个MAT啊,这块我们再摸一下啊,这个MAT的话呢,我们主要呢,是用来分析这个大文件的,分析大文件的一个主要作用呢,就是找出这个内存这个泄露的这个疑点是什么啊,你看我们这个程序呢,运行一会儿之后呢,它就会出现这个OM了,那可能是内存比较小,也可能是有这个内存泄露的这个情况,那我们就需要呢做一个修复是吧,就是我们发现内存泄露的目的呢,是为了我们,呃对我们这个代码呢,进行一些修改,比如没有必要呢,我们是强引用的,我们是可以考虑给它改成是这个weak啊reference是吧,哎,改成我们这个叫弱引用啊,就是发现这个我们就回收就可以了,没有必要让它这个生命周期呢就过长,所以呢,我们主要呢,就要发现这样问题啊,在这里边的话呢,我们呃提到了有两个比较重要的这个工具,一个呢就是这个黑ogram啊,另外一个呢,就是我们讲的这个支配树。啊,这样两个主要的这个工具啊,两个主要的工具,好,那首先的话呢,我们来看一下关于这个hisogram啊,就是我们这里边这个按钮点它也行是吧,哎,都一样啊这呢就帮我们生成了这样的一个黑AG gram叫直方图啊这个信息的话呢,大家其实并不陌生,咱们在这个前面讲到这个解map的时候提到过这个指令啊,然后我们在讲到这个呃,VVM的时候呢,其实也到过啊,这里边呢,主要列举的就是相关的我们内存中加载的这些类啊,加载这些类啊,这些类呢,你看有这么多708个,那我们在这看的是不是已经看到也是708个。
01:33
啊,这些类的话呢,以及这个对象的这个个数啊,这不是在这也写着呢,以及呢,它占用的这个,呃,这个呢叫浅堆啊这呢叫深堆啊各自的这个大小。啊,这个图本身的话呢,应该不是特别陌生,嗯,第一列第二列不多说了哈,第三列呢,叫做shadow keep,它对应的我们叫做这个浅堆,这个浅堆的意思是什么呢?简单先介绍一下啊浅堆呢,就是一个对象呢,它消耗的内存的一个大小,不包括呢,它对这个其他这个引用的,呃,就是引用的那个对象的一个大小的一个计算。
02:06
啊,这个说的有点有点有点有点有点墨迹啊,来举个例子啊,比如说这个这个是picture,咱们换一个吧,比如这个student啊。这个student的话呢,大家会发现你看这里边有一个int,有个他有个他是吧?呃,像这个student,比如我们造了个对象啊,这个对象的话呢,我们说它实际占用这个内存,这个shadow key是多少呢?我们主要关心的就是这个三,哎三呢,这块我们会记录它的一个数据的大小,算到这个浅堆里边,而对于像这样的引用变量呢,他们会指向一个新的堆空间中的一个对象实体,那我们就不专门去记录你这个人家那个实体的这个对象的大小了。当然呢,我们这里边保持这个引用,是不是这个引用还得占各自四个字节是吧?啊,那这四个字节你要记住一下啊,这呢就是我们所谓的这个叫浅堆,那一会儿呢,我们讲到这块的时候呢,还会给大家详细的去说啊,咱们先这个简要的说一下,而这个return的这个hep,就我们说的叫呃深堆啊,相对于浅堆来讲,它呢就叫做深堆,这个深对的话呢,就相当于是我们这叫shadow它的一个总和。
03:08
那这个总和它呢,能够刻画的就是我们这个对象,如果被回收之后呢,相关的呃,这个数据都能够被回收啊,总共的一个大小,就叫return的一个people。啊,这个呢,可能大家比较迷糊一点,这我们讲到下边具体说他俩的时候,我们再提啊,这是这个事儿行,然后的话呢,我们看看上边有哪些操作可以去做啊。一个呢是这个就是当我们去点击,比如说咱们现在呢,看的是当前这个这个OM这个程序,那这个程序当中呢,呃,涉及到了有这样的这个类是吧?这个类这个类这两类,那关于picture这个类的一个说明啊,一个描述,那在这儿呢,其实我们已经找到这个picture了,就在这儿呢,是吧?然后呢,大家点击一下左侧的话呢,这个inspector,我们就会看到相关的这个信息,比如说呢,我们当前这个类它所在这个包是吧?诶,它是由这个大的class进行,呃,相当于它就是个大的class一个实例了啊,它在这个内存中的一个位置,它的父类是谁?
04:04
是吧,诶它使用的是哪一个类的加载器进行加载的啊,这个类的加载器呢,也给我们刻画出来了啊,还包括呢,就是我们这个呃,占用的大小,回收情况啊等等,他没有这个这些root是吧?哎等等啊这块呢,就关于他的这个描述啊,都会给我们呈现出来,这个呢是叫inspector啊,这个其他的这些都都是一样的啊,我们都可以去看啊,这是一个它,嗯,另外一个的话呢,我们这里边呢,由于这个类呢,其实现在看感觉好像还不那么多,当我们真正加载多的时候呢,我们想这个找的话呢,怎么办?哎,这里边呢,它有一些相关的功能,比如说进行一个分组。哎,像我们如果说使用按照这个package进行分组的话。那你看它就是这样个效果,比如说我们想找一下咱们自己那个picture的话呢,你可以找com艾特硅谷下边MAT这个里边是不是有个picture这个类是吧?啊,这就是按这个包呢进行的一个呃,分组啊,类似于我们circle里边那个group一样啊行,这个呢就不多说了,默认的呢,相当于是group class。
05:04
哎,默认呢,相当于就是我们呈现出来这个效果。嗯,行,这是它,呃然后后边这块的话呢,呃这个计算,呃计算这块呢,我们就暂时的先这个不多说他们了啊嗯,还可以干什么呢,进行一个排序啊,比如说呢,大家看到这里边有很多的这个类型,然后我们点这个右键呢,呃最后呢,有个叫columns啊,这个columns呢,这块呢,有个叫so by诶可以进行一个这个排序。就是你便于去找到某些类,你说我这个不好找怎么办呢?那你就排序啊,也可以,比如说我们按照这个class的name进行排序啊,这块你会看到按照这个abcd这个顺序,你看进行排的是吧。啊,这是一个情况啊,啊还可以什么呢?我们这里可以写这个正则表达式。啊就更直接了啊,在这呢,直接大家比如你想看一下这个关于这个picture啊,这个结构跟它相关联的这个类的,就只要显示picture的我们都要啊有点回车,哎这呢,你看相当也能找到它,这就相当于是一个精准的一个搜索一样。
06:00
对吧,哎,相当于是一个精准的一个搜索了哈,好这呢我们说的这个事儿,嗯,然后还有什么是我们比较常用的呢?那就是涉及到我们去分析这个内存,呃泄露的这个问题的时候呢,我们会关注于什么呢?比如说这个picture假设哈,它是一个我们呃怀疑的一个点,那我们通常呢,会去关联它对应的这个jc root,就是看它跟谁呢是关联的啊一般呢,我们就会点这个选项里边呢,接着去找到这儿。啊,这里边儿我们就会把所有的这个呃虚引用这个弱饮用,还有这个软饮用呢,都给它这个排除在外。啊,像这个虚引用的话呢,回忆一下它主要呢是呃,用于这个对象回收的一个跟踪的是吧,我们这个weak呢,称为呢叫弱引用,就是发现了我就回收啊这叫weak so的话呢,就是内存不足的时候呢,我们才回收,哎把这些情况都排除之外,说白了就是你要是个强引用的话呢,导致我这个对象不能回收了,那我要看看到底谁引用着它呢?哎,这里边我们点击一下哎就能够在这里边去发现哦在俄release里边去引用了啊俄release这有相应的这个呃,底层的这个element data这个数组啊数组里边呢,哎,就引用了我们这么多的这个picture这个对象是吧?哎,这里边你要看一看它是不是合理的。
07:10
啊,是不是这个合理的啊,进行一个分析啊,咱们后边有案例啊,这块呢,就相当于先是一个,呃,简单的一个介绍情况。好,那关于咱们刚才说这个黑呢,主要关心的呢,其实就是我们这个啊,这个操作用的多一些啊嗯,这是它然后的话呢,还有一个点跟咱们这个微收VM。哎,跟咱们上面这个VM一样的,就是可以进行两个大部文件的一个比较哈,这个比较的话呢,前提是我们现在这个直方图啊,这个位置上,嗯,大家看这是不是这有一个叫compare是吧?哎,Compare,然后我们点击,比如我们在B这块吧,在B这块呢,你先点一个,你看现在是没有了啊,点下这个直方图,那此时上我们就先基于这个B。基于这个B呢,我们呢去点这个compare,那这块呢,我们去让他看B跟A的一个区别啊,然后点一下这个OK。哎,这张你看就出来了,那相当于就是基于我们这个B啊,去看跟A的区别,我们发现B呢,相较A是不是增加了很多的一个信息,那后期呢,我们出现这个内存的一个OM了,那那这时候我们就要关注一下,你看看在指定的两个时间之内的话呢,你看哪些对象是不是增长的会比较快一些啊,那我们也可以呢,是不是进行一个排序是吧,排序的话呢,我们关心的比如就是你这个对象的一个排序啊,你可以看看哪些对象增长的比较快,这些呢,有可能就是我们担心导致我们最终出现OM的这个原因,对吧,那就通过这儿呢去做个比较,也是比较有意义的。
08:37
行,那这呢,就咱们把这个直方图啊黑ogram呢,给大家呢,主要功能呢,介绍了一下,哎,这个大家呢,就可以灵活的去应用了啊。
我来说两句