00:00
好,那接着的话呢,大家来看一下我这里边写的这个第二个案例啊,第二个这个案例的话呢,是关于一个内存泄露的问题啊,它的一个分析啊好,那我们来看一下,嗯,那这块呢,咱们就把这个第一个这个程序呢,就给它关了。嗯,第一个程序我们在这儿是吧,哎,我就把它给关掉了啊。啊,这块呢,自动的它也就断了行,来我们看一下这个第二个这个程序这个里边的话呢,诶同样呢,我定义了一个类啊叫B,这个类里边呢,有一个size,有一个磁针形的一个字符串,然后呢,大家注意我这儿呢,定义了一个叫a list。啊,List呢,目前我标识为是static的,好,然后我们看上边啊,嗯,这里边呢,我是一个well two跟上边这个案例呢,一是一样的啊,里边定一个list,这是另外的一个L,然后呢,我这还是一个for循环,在for循环里边呢,我定义了,呃,就是通过这样一个循环嘛,定义很多个这个B的对象,然后把这个对象呢添加到我们,哎,把这个对象呢添到我们的这个上边这个early当中。
01:00
啊,定义到这个,哎,添加到这个list当中,然后注意我这里边有一个操作啊,就是哎,我造的这个B的对象,它里边不是都有哎共用的一个list嘛,哎,这个list里边我去添加一个字节数组啊这呢是10KB是吧。好给它添加进去啊,相当于的话呢,我们会使得这个,呃,力子呢,是不是又越来越大了,哎,这呢是相应的休息一定的时间好。接下来我要分析了啊,这个a list跟我们上一个程序的a list呢,出现的位置是一样的,当我们执行完一次里呃外层的这个呃,循环执行完一次的时候呢,咱们这个a list是不是就自动的进行了一个销毁吧。对吧,它就销毁了,好,那它销毁的话呢,对应的这个里边的这些B对象是不是就也销毁了。对吧,也就销毁了啊,但是这里边儿有一个问题,就是我们当前这个对象呢,呃,它里边呢,呃,这个类里边生明的个静态的这样的一个变量,而这个变量的话呢,它是不是不会销毁,而它呢,是不是就越来越大呀。
02:03
啊,它越来越大,好那咱把这个程序呢跑一下啊,那这块呢,咱们找到这个memory link,然后点击它,哎,可以直接呢调我们这个接啊好OK一下。嗯,没出来,那咱们自己给它点开,嗯,好了,这是针对我们这个memory link的啊,嗯,这呢有它关于这个内存的一个使用的一个展示的一个情况是吧,那这块他在往上走啊,这个咱们就先让他先走着,咱们看一下这个内存的一个情况,呃,看一下当前的这个记录,我做了一个钉一个标签,然后啊,大家呢,其实也看到这个场景了啊,我们这里边有一个BY的这个数组,你看它越来越大。啊,越来越大啊,相应的呢,你看我们这里边有一些这个B对象啊,这个B对象的话呢,诶比刚才那个多了,你看我这块啊,看我还没点呢,是不是它自动的就有一个JC了啊,你再回过去看一下我们当前这个内存的一个情况。
03:00
哎,内存这块呢,你看始终在往上飙升是吧,那我们看这这个GC的一个activity是我们这个,诶垃圾回收是不是始终呢能够正常执行,但是呢,整个这个memory的话呢,你看在始终的往上长,那很有可能一会是不是就出现这个OM了,对吧?那我们来分析内存的话呢,会发现啊,这里边的这个B呢,倒是呃,时不时的啊,随着我们这个JC呢,它就会被回收掉,但是上面有一个比较大的一个对象啊。你看这个对象的话呢,个数当然也不少。啊,这个数也不少,然后它这个内存占用的话呢,已经很多了,因为我们现在执行的时间其实很短啊,那现在我们是不是要关心这个对象了,对吧,关心它啊,然后呢,这个大家也可以呢,去记录一下我们关心的这个对象的这个情况,这是默认的里边他给我列举出来的啊像这个。BAT的这个,诶,我们这块也可以盯一下哈,哎,BAT这个数组,然后上面是这个B对象啊,B对象的话呢,其实我们做一个JC回收的话。哎,你看它就会被回收掉啊,给回收掉了,现在就还是我们这个B的一个,哎,这个BY的这个数组比较大啊,我们这块呢就可以是不是,哎在hiop worker啊这里边呢,进行一个观察是吧。
04:10
这呢,我们你看刚才也能看到,就是一个快照了啊啊这呢我就进来了,进来以后呢,现在我们看到了这个对象呢,目前是比较大的啊,占用的这个空间呢也比较多啊,那它相关的这个引用都有谁呢?哎,我们点一下这叫哎references啊,它是不是有这么多的这个对象呀。没问题是吧,好,那么这些对象的话呢,哎,我们想看一看,比如说你使用的这个,呃,就是你这个结构哈,使用的这关联的这个对象都有谁呢?哎,我们想看一看是谁在引用你啊,Incoming references啊,我们点击一下啊,做一个OK,好针对于这个对象,然后我们现在呢,给它打开。这个对象的话呢,它就是在我们的这个数组里边啊,这个object数组,那这是谁呢?好,发现了,这是一个a list啊,叫element data,其实就是这个数组的一个名字哈,然后这个list在哪里呢?诶是在我们这个B这个类里边定义的啊,然后再往下呢,就是我们这个这个类了是吧?哎,在我们整个这个程序当中啊,这呢,其实大家就能看到,其实呢,就是我们在这个B这里边是不是定义了一个a list是吧?哎,其实呢,就是它,哎,它这里边那个数组嘛。
05:16
是吧,哎,一个object一个数组,Object数组里边呢,每一个元素都是一个BA数组啊是它这块呢比较大啊,呃,也可以呢,咱们这块在点右键,它有一个呢叫showing gra是吧?诶在这块也能看到啊,它呢是跟这个呃,我这速度有关联的,它呢我们在一直推到这个jc root这块。哎,一直推到这个j c root这块,哎,就对应到我们这个B这块了啊这块你再往前去推呢。啊,再往前就到我们这个呃,Memory link这块了啊呃,相当于呢,就是我们这个B这个类里边啊,一直关联到我们这个bad数组啊这块,那bad数组越来越大,是因为我们当前这个类呢,是不是始终没有回收过是吧?哎,它没有回收,所以导致我们这个BY的数度呢就越来越大,因为我们不停的诶再往里边呢,是不是在添加数据啊,哎导致的是吧?哎,这个呢,呃,一会儿的话,我们就会发现这个内存呢,会出现一个。
06:07
出问题了。啊,移出问题啊,当然我这是做了一个模拟啊,做了一个模拟啊,也就是呢,有的时候呢,我们这里边儿呢,这个结构不应该设置成是一个静态的啊,那如果你要设置成是一个静态的话呢,就会出现啊咱们刚才说的这个这个问题啊,也算是一个泄露的问题啊,啊那这怎么处理呢,我们把这块呢给它先停下来。啊,这个呢,自然而然也就停了啊,接下来之后呢,我们把这个呢,给它复制一份啊,从这个静态呢就给它去掉。啊,把这个注释掉啊,这个呢给它打开了是吧,打开之后呢,这已经不是一个静态的了,那这个时候呢,它的这个release是不是就会随着我们这个B对象的一个销毁而销毁啊,就不会出现一个呃内存潜在的一个内存溢出问题了,对吧。啊,我们也可以针对这个呢,再去跑一下啊。当然这个呢,我们说见到这个静态呢,是不是我们都要给它改成非静态呢,这个我们还得具体问题具体分析啊,有的呢,不适合用静态的,千万不要用静态啊,那就是潜在的一个泄漏问题。
07:08
那这时候呢,我们打开啊,大家看这个memory,虽然说这个memory的话呢,你看往上涨,但是呢,我们再进行垃圾回收以后的话呢,它是不是及时的就回到一个比较低的一个点上了,对吧?那我们再看这个内存的一个情况。啊,虽然说呢,也会有相关的一些对象呢在增加,但是呢,一旦进行这个JC之后呢,它其实也就会回到一个比较最初的一个状态。嗯,这块你看还还不是很明显是吧?啊这块出来了,出来以后呢,你看一会儿它就会JC掉了。啊,这呢就是一个正常的一个情况哈,从长远来看的话呢,它不会出现一个呃最后的一个内存的溢出,好那这块呢,就我们通过这样的一个这个这个案例啊,给大家呢去做了一个演示,就是说诶适不适合呢,我们到底生命城是个静态的啊这个我们要具体问题呢,做一个具体的一个分析是吧。哎,这样的情况好,那么。这样的话呢,咱们就把这个鸡呢,咱们就说到这儿啊,这就过了啊。
我来说两句