00:00
好,大家看这里呢,我又写了一个案例啊,这个案例的话呢,跟这个移动端的开发是相关的啊,有些同学呢,应该接触过这个安卓开发啊,因为呢,也都是用这个Java语言写的是吧?啊,当然用这个Co也可以啊呃,那这儿呢,我举一个移动端的一个例子啊,做移动开发的同学呢,应该会比较熟一些啊,当然了,没有接触过安卓开发的,呃,也不是太陌生啊,因为呢,我们相对来说天天都用手机啊,这个用户习惯呢,大家是有感觉的是吧?好,我们来看这样的一个案例啊,这个案例的话呢,我就也是写在这个idea当中了,那这个呢,我就导入了这个。呃,安卓的这个IDK啊,这张就可以来写了,行,那这里边的话呢,你看我这是一个test activity啊,它继承activity,这activity的话呢,其实就是安卓端的四大组件之一,哎大家呢,直接就把它理解成是我们一个activity的这样一个实例啊,这一个实例呢,就对应着我们这个手机的,呃,具体一个应用的一个页面啊,页面也行,或者你叫叫页面吧,叫界面了啊啊这一个页面呢,呃,它这一个对象。这个对象呢,就对应着我们一个activity的一个对象。
01:02
啊,就这个意思,好,那你看看这里边我想说明是什么问题啊,嗯,在这个on create方法里边啊,这个方法呢,就类似于咱们比如说那个呃,In方法啊,就初始化的那个方法啊,那当我们这个页面呢,生成的时候,大家在手机上呢,你能看到一个应用的一个页面展开了,你能看得见了,这个方法呢,就一定会被调用过了。啊,在创建的时候呢,它会加载相应的一个这个布局啊,就你这个页面上都有什么样的这个视图啊等等都会加载过来哈,然后在这个页面上呢,诶,你看我这里边呢,写了一个线程是吧?啊写了一个线程啊,然后让这个线程的话呢,最后是一个start了,但是这个线程里边注意啊,我这呢是一个同步的操作,持有呢,对外层这个对象的一个哎,变量的一个引用是吧?哎,同时的话呢,里边我让他还wait了,说白了就是我们这个线程呢,是不是这个就阻塞到这儿了,因为它这有个weight嘛,是吧?啊就waiting了啊,他在这等着啊,但是他呢,是不是又持有了我们外部这个对象里边的一个具体的属性是吧?哎。
02:00
嗯,外部的这个相当于还销毁不了啊呃,那这里边儿这个问题是什么呢?就这样子的。大家呢,当你去出现一个手机这个页面的时候,假设这个页面就对应的是这个类的一个实例,那这个对象呢就创建好了,那它创建好以后呢,它会自动的去调用这个on create方法,那我们这里边儿呢,这个线程是不是相当于就创建并这个start了是吧?然后这个时候呢,诶我们手机呢,有这个返回键啊,我一点返回键呢,其实当前这个页面呢,就给退出了啊这个退出呢,其实就意味着当前这个it呢,这个对象呢要销毁了。注意,这个对象要销毁了啊,但是哎,出来但是了啊,但是呢,我们当前啊,当我们点返回之后呢,我们这时候的这个JC呢,呃,当然你在适当的时候就可以JC了啊,不是说我们一返回它就立马JC,得看这个内存空间够不够是吧?哎,当我们返回之后呢,需要JC的时候呢,呃,试图呢去销毁它,但是发现呢,这里内层的这个线程它始终没有结束啊,还始终引用了是外层这个对象的相关结构了,导致我们这个S呢就没有被。
03:01
销毁。啊,那么对于这个activity它自己这个对象啊,我这画的是累了啊,是这个类的一个对象啊来讲,就存在着一个内存的泄露问题,就是由于我们这个限制呢,没有结束造成的。啊,没有结束造成的啊,那这呢,我们把哎我我就不在这个模拟器上再去跑了啊呃,我们把这个呃相当于这个结构呢,执行之前还有呢,我们这个返回的时候,退出的时候呢,诶这呢,对应的这个大幅文件呢,我们做一个分析对比啊这呢我就直接诶说这个。分析的这个截图了啊,把核心这个截图呢,我们放到这就可以了。好,这呢,我就直接把这两个图放过来啊,那么在回收之,在这个返回之前呢,我们这个h pro文件和之后的这两个文件做个对比啊,我们不是讲过这个对比操作吗?哎,对比操作呢,发现我们这个activity呢,这块他竟然没有做一个销毁,那什么原因造成的呢?我们看到底谁还引用了它,引用了它,哎,我们就可以点这个test activity,这有个呢叫诶。移除这个呃软这个虚引用弱饮用软饮用之后啊,其实呢,主要就关心这个强饮用的问题是吧?哎,然后点开一下,我们看到底是诶谁引用着它呢?哎在这个test activity发现啊发现呢,我们内部呢,这里边有一个诶内部的一个结构呢,去调用着它啊相当于类的一个实例来调用它,而这个所谓的内部的这个结构,其实就是我们这里边,哎,大家看到的这个内部的这个呃,匿名的线程对象。
04:26
啊,所以导致我们这个当前的activity这个它的实力呢,就没有被销毁掉啊,它呢就是一个内存的泄露问题啊,这要大家注意啊好,那发现问题呢,以后我们该如何去解决呢。啊,该如何去解决呢?啊,所以这时候呢,我们说尽量呢,诶还跟我们讲前面这个案例是一样的哈,哎,建议呢,我们去选择这个,诶弱引用是吧,这样的话,我们做这些的时候呢,就可能确就可以确保啊它可以被回收了。啊还有呢,在这个安卓ID当中,我们使用的经常会用这个handler和这个handleler这个thread啊,在这时候也是一样啊,尽量的我们采用这种弱引运动方式啊,及时的调用我们这个循环的一个结束啊等等来这样操作啊,这个呢就是具体安卓的一个实现了。
05:06
啊行,那这呢就相当于是在移动端方面呢,给大家呢,也举了一个例子啊,相对来说可能比较形象一些啊,因为大家天天用手机啊返回键是吧?啊,你在返回的时候呢,这个对象其实要销毁的啊,你不要再有其他的这个无关结构,你还占用它啊,要不呢,你就给它改成个弱引用是吧?哎,保证其实能够销毁掉啊,没有泄漏问题。好,那这样的话呢,我们把这个内存泄露这个整个这块的内容呢,咱们就给大家又详细的说了一下啊好这块呢,大家应该是比较厚实了。
我来说两句