00:00
好,那接着的话呢,咱们来看第二个啊,叫做这个内存视图啊,这个live memory,好,我们打开咱们写的这个OM这个程序啊呃,这个live memory打开之后呢,诶,我们看到它下边有这样的几个选象,呃,第一个呢叫所有的对象,呃,第二呢叫记录的这个对象,呃第三个的话呢,叫分配的这个调用的数是吧,或者叫访问数,嗯,然后下一个呢,叫做分配的一个热点啊下边呢,是一个叫类的一个追踪器,哎,大家会发现呢,我们除了第一个之外呢,剩下这些呢,相当于是不是都没有开启对吧?哎,都是没有开启的这样个情况啊好,那我们就先来说第一个啊,第一个呢叫所有的对象这块大家打开之后呢,发现诶比较熟悉是吧,咱们在之前讲到相关的其他的这个结构的时候呢,讲到过那个直方图啊hisel对吧,那黑ogram也行啊,直方图里边呢,就列举出来咱们啊,像这里边内展示的当前我们这个程序当中啊,咱运行的这个OM这个程序里边啊,涉及到了有哪些结构。
01:01
啊,哪些类啊,这是这个类的名字,然后呢,关于我们这个相应的这个类呢,它创建的实例的个数啊,以及呢,呃,对应的这个实例的一个大小。注意这里的实力大小呢,我们前面讲这个MAT的时候呢,提到过这个浅堆和深堆的一个问题,对吧?哎,这里边呢,注意这个对象呢,是不包括它内部包含的这种引用对象,引用的这些成员变量的那个引用的那个实际大小,相当于这个就是一个浅流的一个概念啊啊这呢是我们说的这个事儿。呃,然后这呢,我们也能够实时的能够看到当前这个程序在运行的过程当中,这个实例数的一些变化,对吧?啊,比如说这里边你看有一个非常好用的工具,叫做mark current啊,以前呢,我们讲的时候呢,是对两个直方图做一个对比,能够发现一个变化,我们现在呢,只需要做一个诶mark current,诶大家会发现呢,这时候它变成绿色了,就基于刚才我点击的这个时间节点之之后是吧,然后呢,相关的一些内存的结构啊,对象的一个变化,你看它这呢,也都能够给我们再凸显出来啊,就是加减的一些变化。
02:04
啊比较好,那注意有可能也会减哈,因为呢,我们是不是也有可能进行这个垃圾回收了,是吧?啊有过垃圾回收行为的话呢,它相应的这些呃,就会做一个减。好,那目前的话呢,它是以一个class的方式给我们呈现的,咱们呢也可以呢去选择别的啊,现在这个MAT啊,其他的工具当中,咱们得用那个TED by是吧来排序,而这呢,直接做这个选项就行,哎,我们可以选择这个package啊,这呢就呈现的是以这个包的这个情况是吧?以包的个情况给我们展示的啊,像这里边这个at硅谷及professor里边关于这个picture啊,这个类它的一个情况。就是以包的形式哈,那当我们这个程序比较大的时候呢,大家可以考虑呢,使用这种包的方式来展示啊,这就可以了,行这呢是我们说的这个classes啊呃,然后这边的话呢,我们。简单强调一个点呢,就这里边我们会看到这个数据呢,其实是不断的是在更新的是吧?呃不断的是在更新,那么这个更新的话呢,我们就会涉及到它是一个完全的,比如说呃,每一毫秒就会更新一次嘛,啊其实这个呢是不一定的啊,我们说这个更新的这个频率呢,跟咱们堆上的这个对象的一个多少啊也是有关系的啊,它会有一个自动的一个调整啊,如果我们对上这个对象呢,比较多啊,那这时候呢,我们去统计这个数据呢,呃,花费这个,呃这个叫什么CPU资源呢,就会多一些,所以我们的更新的频率呢,就会低一点,那如果你要这个对上的对象少呢,那我更新的频率就会高一点,所以这有一个动态的调整。
03:28
那如果大家你想说实时的去,呃,这个看一下当前的对象是多少,大家也可以手动的去点一下啊,这不是有一个自动的个更新是吧?诶你点一下呢,它就更新一次啊,你看我点一下这个是不是就更新一次啊,就这样的啊啊这是我们说的一个更新的问题,呃,然后的话呢,我们先给大家强调一个点,就是通过这个表格我们能够挖掘的一些信息是什么呢?哎,我们现在给大家呢说一下这个事儿啊。啊这呢,我写到啊,写到这个,比如这个下边吧。啊,这儿呢,我们去做一个这个分析啊。
04:00
哎,分析什么呢?就是分析我们这个内存中的这个对象的。啊,这个一个情况啊,啊,因为我们知道呢,这个内存当中一个对象啊,是导致我们内存泄露啊,内存溢出的一个主要原因了,对吧,那这里边儿我们主要关注几种情况呢?哎,首先第一种情况呢,就是频繁创建的这个障碍对象。啊,频繁。创建的,哎,这个大对象。啊,那相当于我们在这个表格当中能够看到就是这个对象的这个个数啊,哎,明显这个个数呢,就比较多了是吧,这就是我们能够看得到的就是频繁创建的一个对象啊,那对于这种频繁创建的对象的话呢,我们需要做一个关注啊,有可能比如说像这种呃,死循环导致的啊,或者说呢,是我们这个循环次数过多。哎,导致呢,就是我们呃,创建了大量的这个炸药对象,而这个对象的话呢,我们这个正常来说,哎是可以比如说进行回收的啊,那你要太多的话,那不就泄漏了嘛,是吧,那可能会溢出啊,这是第一个关注的点,那第二呢,我关注的点就有可能会存在这个大对象啊。
05:05
哎,存在这个大的对象,那比如说我们去,呃,读取这个文件时。啊,读取文件的时候呢,咱们知道都是使用这个BAT的一个字节数组是吧?啊那我们建议大家呢,是不是应该针对这个BAT数组,是不是应该呢,就是呃,边读边写呀。就是你读一点的内容呢,你就给它写出一点,保证了我们内存中的这个BY的速度呢,不会太大啊,那如果说呢,你是一次性的给它读到内存当中,再一次性的写出去,那可能呢,会导致是不是咱们这个派的数度呢,就有可能会过大是吧。哎,这个如果。啊,长时间啊,不写出的话。啊,导致。哎,导致我们这个BA这个数组呢,就有点还扩大了啊,那这呢是我们要关注这个问题啊,就有可能会存在这个大对象,而这个大对象呢,其实我们也可以通过这种表格的,诶这个场景下我们能够监测得到啊,能够监测得到啊行,这是一个,然后第三个呢,我们要关注的就有可能会存在这个,诶内存的一个泄露问题是吧?哎,那这个泄露的话呢,我们在前面呢,也给大家专门讲这个泄露这个概念了,诶我们再说这个泄露问题,咱们该如何呢去做一个监控啊,那首先呢,针对于这里边儿的前两个场景,我们看在这个表格里边怎么去这个观察啊。
06:21
首先在这里边提到这个叫实例的一个个数,还有它的一个size啊,通过这两个呢,我们能够发现相关的一些信息啊,如果大家也会发现这个size呢,比如说比较大了,这个size比较大,嗯,而且呢,我们对应的这个呃,In森的这个count呢,呃,比如说呃也比较大啊,就是这个大,这个也大,那就意味着实际上我们这时候创建的是不是这个对象呢,就比较多,其实对应的就是咱们刚才这里边提到的是不是就第一种情况。对吧?哎,这是第一种情况啊,那这时候我们就要看一下啊,你这个创建的对象比较多的啊,这个类呢,是哪一个类,你看这里边它就是这个picture这类比较多,那我们就回到代码层面呢,你看看这个picture啊,为什么创建的对象有点过多,没有被回收掉,哎该做分析做分析啊,该调整代码调整代码啊这是我们说的第一种情况,那第二种情况的话就是如果我们发现呢,这个,呃,对象的这个size呢很大。
07:13
啊,塞得很大,哎,但是呢,它这个对应的个数呢不多。啊,塞塔那个数不多啊,增长的也不多,那就说明了我们这个对象呢,是不是就比较大。啊,那这个对象就比较大,那这个对象比较大,我们也需要在程序当中去看一看,是不是一个合理的行为,对吧?哎,通过这样的方式呢,我们哎能够挖掘出来一些有关的信息啊是什么啊,这是我们说的这个事儿,诶然后呢,我们来看这个第二个啊叫recorded object诶大家会发现呢,这个正常情况下呢,他就没有帮我们去做一个记录,对吧?啊那这儿我们想强调的点是什么呢?一旦大家呢,去开启这个record,就是做一个记录的话呢,它首先呢,会导致我们这个程序的这个系统这个性能呢,会急剧的降低啊降低的非常严重,那这呢,我们就提到这个recorded,这个object什么时候用呢?哎,这个注意咱们是在诶这个判断。
08:00
这个拉这个内存泄露的时候,哎,我们才会要使用这个记录的一个功能。啊注意啊,咱们判断这个内存泄露的时候呢,才会使用这样的功能啊,那什么时候才可能会出现内存泄露呢?其实我们通过这个memory的话呢,大家也是哎能够看到一些端倪的啊,当然咱们这里边呢,哎没有严重这个泄露问题哈,呃,咱们才这个发现呢,它有一个内存的泄露问题呢,呃,应该是这样子的哈,就是我们这个使用的这个内存呢,大家会发现呢,它往上涨对吧?然后呢,诶这个相应的有一些垃圾回收,垃圾回收完之后呢,诶它这个,诶这个我重画一下啊。这个内存的话呢,一直往上涨,涨到这个,比如说诶比较高的时候,我们要进行垃圾回收了,垃圾回收完之后呢,诶然后这块呢,它再接着往上涨,然后再进行垃圾回收之后呢,再接着往上涨,你会发现呢,他每次垃圾回收之完之后的话呢,它这个剩下的这个内存。啊,占用的是稳步的在提升啊,或者接近于像是一个线性的这样一个关系,那说明呢,我每次垃圾回收制版垃圾回收之后的话呢,这个呃,不能回收的这个内存是不是就越来越多呀。
09:03
对吧,哎。那么对于这种情况的话呢,我们就要怀疑啊,它可能会有内存的这个泄露问题。啊,会有这个泄露的问题,那这个时候呢,我们就可以去开启这个叫啊recorded object了,我们在这里边呢,做一个相关的这个分析啊,那这个进来之后呢,你看这里边有关于季度的这个一个分配的情况啊,然后这个我们也可以change啊,这是涉及到所有对象还是呢,我们每到十个这个每十个分配的时候呢,我们就做一个抽样的一个样本啊,这个呢,就是相应的消耗这个内存呢就更小一些啊,CPU占用更小一点,然后下边这块呢,就按照不同的这个类啊,还是这个包啊进行一个这个分组是吧?哎,这个这个这个我们不用过多关注了啊,那这呢我们会看到啊,刚才提到了有这样的几个类啊,他们这个你看对象的一个添加啊,个数的一个变化情况是吧,啊,你看这会我们做一个实时刷新也可以啊,比如我这块定一个这个current啊,你能看到它这个个数的。
10:00
接着的一个变化的一个场景啊,那么在这里边的话呢,我们就要感兴趣,呃,有可能会存在这个相关的一些泄露问题了啊,主要呢,是针对这三个啊类是吧。那么这里边儿我们怎么去看呢?啊,比如大家会看到我们当前啊,你看我点击这个右键呢,这有一个呢叫change啊,Liveness mode啊,涉及到呢,比如我们是活跃的对象还是呢,垃圾回收的对象还是活跃的跟垃圾回收的都有啊,当然在这块呢,应该也在在view这块也可以做一个选择哈,那在这也能选是吧?好,那我们当前这块呢,你看我选一下这个叫。哎,选一下这个叫alive这个模式,你看有这样三个类啊,三个类,然后呢,诶,我们比如说再选一个这个叫垃圾回收的这个对象,看看都有谁呢,来点一下。哎,点一下会发现,诶没有了是吧?哎没有是什么意思啊。没有没有呢,是不是就意味着咱们当前的这三个结构啊,这哥仨的话呢,是不是都是在这个活跃的对象里边,没有涉及到垃圾回收啊,那比如我们点一下这个啊JC。
11:03
啊,那我进行这个垃圾回收啊,进行完垃圾回收之后的话呢,大家会明显发现咱们的这个结构和这个re,这个结构,它这个对象你看是不是急剧的减少,然后现在呢在回升是吧?呃,相当于这两个结构呢,是可以进行垃圾回收的。啊,之所以没回收,是因为我们内存呢,还没有满是吧,而我们这个picture的话呢,你会发现呢,它是明显的在咱们的这个。在这个gar壁纸里边呢,你看是没有呈现的。啊,没有呈现的,那也就是说呢,这个picture它是没有进行过这个垃圾回收的。对吧,他是没有进行过垃圾回收的,而他这个对象呢,诶特别的多,占用的内存呢也很多,哎,他还不能垃圾回收,那这儿呢,诶基于我们刚才看到的这个,如果发现每次垃圾回收之后呢,我们这个剩下这个内存还稳步的提升啊,那这时候呢,就是一个泄露的一个典型的场景了,那这个场景基于谁出现的呢?就是咱们刚才。
12:01
诶,这个在下边这块啊,哎,分析以后呢,这个picture了,哎就它是吧,然后呢,大家针对这个picture呢,我们进行一个分析就可以了,比如我们这块呢,还可以去呃进行堆的一个追踪啊,这个堆追踪呢,我们就诶定位到下边这个追踪这块了啊点击一下。啊,就跑到这个场景下了,然后我们可以记录一下刚才呃,这个record这个对象就是涉及到他是吧,哎,就跑到这来了。好,那这儿呢,咱们就针对于刚才诶我说的这个啊,Live memory里边的一些主要的一个功能给大家做这个说明啊,后续这块的话呢,我们就不过多的展开来说了啊,大家需要用的时候呢,我们再来看啊呃,通过刚才这样一个说明呢,大家需要关注的就是我们通过这个内存的一个分析啊,呃,咱们主要关注的这几个点对应的这个,呃,在图表当中的一个展示,我们是可以挖掘出来相关的这个信息的啊就可以了。
我来说两句