00:00
好,那刚才的话呢,咱们是基于咱们看到这个picture啊,说怀疑它呢,是不是存在一个内存的一个呃,泄露问题是吧?呃,因为呢,我们在进行这个GC的时候呢,发现根本就诶它呢就回收不掉啊,那这时候针对于它呢,我们就点击了一下叫in keep worker啊在我们这个堆这块呢,我们就相当于调用到这个位置了啊啊在这个位置的话呢,我们能看到啊,这里边有一些相关的一些选项啊,比如说当前的你这个类啊有哪些啊,它的一个分配的一些情况是吧,就是记录我们这个对象分配的一个分配数啊,还分配的一个热点啊等等。啊,这呢是我们这个最大的一个大对象啊,相关的引用,呃这块呢,是这个对应的时间啊,记录我们这个呃对象呢,这个解决时间的一个柱状图,其实是啊,哎这块呢是inspection啊,是一个检查啊检查等等的一个情况,看graph是一个图表啊好,那我们先回到这个classes这块,那针对刚才我们比较怀疑的这个叫呃picture这样一个类啊,这块还是以不同的这个方式来进行一个分组的是吧?呃,然后这块呢,诶我们就呃直接呢针对它啊针对他的话呢,我们看到当前这个实例的个数,哎,他这个size啊,其实都是比较大的。
01:08
哎,然后我们可以怎么着呢?哎,这时候呢,去点一下这个右键啊,比如说去使用一下我们已选择的这个对象啊点击。这块的话呢,我们针对于当前这个picture这个类它的这些实例哈,咱们可以干什么呢?呃,这个大对象一般不看它了,就看这个了啊呃,咱们在讲前面这个呃,MAT的时候呢,提到过这个是不是outgoing references和incoming references就是一个呢叫引用,一个呢叫引用,哎通过这个呢,我们去观察呢,这个它相关的一些引用都有哪些啊,进而呢,去发现这个内存泄露的一个问题,对吧?啊,比如我们看到它这个,呃,这个谁指向它了啊,这个呢,就是我们叫incoming啊,然后我们点一下这个OK。好,我们会看到呢,诶这相关的这个picture这些对象啊,这不是每一个就是我们这么多对象对吧?那这些对象呢,说谁指向它了呢?啊,它是在这个数组里边的,这个数组在谁呢?啊在这个list这里边,List呢就在整个我们方法当中去创建的,哎,通过这个呢,咱们大家呢,层层的去看,当然了,我这个程序里边呢,这个picture就在当前这一个release里边去这个加载的,它也有可能是被其他的一些这个结构呢,呃,引用了啊。
02:16
啊,这个我们这个程序呢,已经结束了是吧?啊结束了这块呢,他就给我报这样的一个问题了啊这个还没说完呢是吧,好这块点一下这个OK啊嗯,咱们把这块呢再给它提起来啊前提呢,你得先这块把这个先跑起来啊。哎,抛起来了是吧,哎,其实呢,咱们刚才要说明这个问题呢,也基本上已经说清楚了啊,哎,再把它呢,给它start起来。啊,点一下这个啊,点一下这个OK啊再跑起来啊跑起来呢,针对于我们这个live这块啊,所有的这个对象啊,所有对象这块呢,我们可以记录一下,看到这个事实的变化是吧。啊,现在就开始这个对象的这个创建了啊,我们发现这个picture一会儿就越来越多,越来越多啊其他这些结构呢,都可以回收,哎,我们刚才呢,是不是做的这样操作,然后点一下这个OK。
03:02
哎,跑到这来的,然后在这呢,我们就点了一下这个啊,然后这块选的是这个incoming啊,然后点OK是不是过来的对吧?好,那如果说呢,大家发现呢,这个picture呢,还有其他的一些这个对象引用着呢,而那些对象呢,已经呃不再被使用了啊那导致我们这个picture呢,可能就没有回收掉,这就是一个典型的内存泄露的一个场景了,对吧?哎,这是这个问题哈,嗯,还可以怎么着呢?关于这个picture呢,大家你去呃,就是通过这个列表的方式呢去呈现的哈,你也可以呢,就这块点右键有一个叫。嗯。Show啊,这个,呃,Show pass to j c roots啊,J c root,我们看下当前这个对象呢?它到底是谁指向着他。啊,这是这样这样这样我们列的啊,嗯,我想看一下图表。哎,这样这样是吧,好这呢就是咱们当前这个picture啊,它下边的里边有这个对应的这个字节数组啊,这就涉及到我们这个程序这个细节了哈,是不是有这个字节数组,主要是它这个比较大了是吧?哎,然后再回过来,然后它呢,是由我们这个object呢所指向的,那这object呢,它呢,呃这些入是谁?哎往前指啊是一个release的啊release再往前呢,是一个没方法,就相当于呢,层层的往前去找,你看到底这个,呃当前这个对象是谁指过来的,而前面这个对象呢,我们看看到底有没有用。
04:20
啊,如果没有用了,还指向了,那这呢指针比如说本身不该存在,这就是一个典型的泄露的场景,对吧。啊,这是我们说的这个问题啊,行这呢,就咱们说的这个叫hi worker,就对于我们去分析呢,内存泄露它的一个意义所在啊,一个意义所在。呃,这是它我这这样的话,我把它先先关一下啊,诶关一下这个呢,就是问你是不是要保存一个session啊,如果呢,你要是保存了一个session啊,举个例子啊,哎,这块比如说写一个我就要这个local attach。啊,就就比如说是他吧,然后这时候呢,你看我们再去。打开一下这个je。啊,这个是它了,我们想再重新起一个啊,那针对刚才我们测试本地存在的这个就把它关了啊。
05:06
行都关了,然后这块呢,我再重新再开一个啊。好,重新开一个的时候呢,你看这时候呢,大家就可以选择刚才我保存的这个是吧,哎,我这块呢,其实也不想演示这个事儿啊,我重新的把这个OM呢给它打开。哎,填上OK,呃,我为什么要关呢?呃,通过刚才呢这个维度啊,咱们是从这个live memory这块呢给他,呃对针对于怀疑的这个数据呢,我们给它导到这个对空间的一个worker这块来进行查看的啊看看对空间当中它的这个jc root啊跟谁去关联的啊,那除此之外的话呢,你看我们这个,呃黑worker这块啊,大家呢,也可以干什么事儿呢,你看我们独立的去啊做相关的一些快照,比如说啊,大家看啊,我们可以生成当前的一个对空间的一个快照。啊哎,然后下边这个呢,就生成一个h pro,就我们说的这个堆的转属文件是吧,比如我们点击下边这个对转文件,哎,咱们呢,比如把它放在嗯,之前的这个都是写在这个D盘下,哎哎,这是MAT的一个log啊,那比如我就也写到这个里边了,哎,我们写一个是j pro。
06:12
啊啊一啊,它的一个啊h pro文件。好,这个呢,我点一下这个保存。可以了。好,那这时候呢,你看已经帮我们帮我们启动了俩,而这个呢,就是相当于我们现在呢,是通过一个离线版这个的方式来看啊,当前那一刻我们记录的一个堆转储文件的一个场景。还有一个场景啊,这块你关了倒也可以在D盘下。嗯,这个itt他是吧,找一下我们这个J。哎,这个打开,哎。跟刚才这个场景是一样子的啊,这个呢,就是我们去离线的分析一个呃a pro文件啊,使用这个j pro啊来做的这个事儿,好,我这个就关了啊呃,这是一个另外一个呢,就是大家也可以呢,去生成一个这个hi的一个当前的一个快照啊这个我们呃for jc啊这个通常呢,我们会把这个也给它勾选上啊,点OK。
07:07
啊,接OK。啊,这呢,也是呈现咱们当前这样一个场景的一个情况啊,这就是一个当前的一个快照啊,一个快照行,这个呢,就是我们相当于是呃,如何使用这个j profile呢,我们去导出一个快照,导出一个对传文件啊,就是在我们这个位置呢,做一个选择。好,那这呢,我们就把这个黑worker呢就说清楚了。
我来说两句