00:00
好,那么同学们,咱们刚才呢,通过这个案例呢,就把这个深推和浅推呢,进一步的进行了一个说明,好这块呢,大家下来呢,自己也可以这个实际操作一下,然后呢,我们再讲一个概念呢,叫做支配数啊,Dominator tree,那对应的就是我们这个MAT,对应的这个h pro这个文件里边这样个操作啊这呢就是启动我们这个dointer,这个tree啊,那在我们进行这个操作之前啊,咱们先进行先进行一个理论上的一个说明。首先的话呢,我们这里提到说这个支配数呢,它的这个概念呢,它源自于这个图论啊,图论这个大家不知道有没有听过啊,这呢其实也是一门课程啊,这个我们在,呃,我在本科的时候呢,学的是数学啊,这个数学与应用数学,然后是统计这个方向的啊,跟着这个导师呢,是个统计方向,然后呢,统计学呢,是要学这个图论的啊,这里边儿是什么意思呢?就是说呃,咱们如果把这个内存中的所有的对象呢,每个对象看成是一个节点的话,那我们内存中是不是就非常多的这些节点是吧?哎,这是没问题的哈,然后这些节点的话呢,它会有一个这个引用关系,比如我们这个对象呢,引用了这个对象,这个对象引用这个对象了,这样的话呢,我们是不是就生成相应的这个叫呃,有向图是吧。
01:08
啊,有向图,那我们这里边这个支配数的话呢,其实也就源于这个,这个有向图展开的啊,谁支配了谁,相当于是进一步的去描述这个有向图的一个问题。好,就是还不是完整的,像我这块列的是什么呢?我这块列的相当于是一个对象的一个引用图哈。这是个引用图,而我们这个支配数的话呢,它跟这引用图还是有些区别的啊,你看下边这叫引用图,这个呢,就是支配数的图不一样,好,那下边我们来看一下什么叫这个支配数。说媒呢,它提供了一个称为这个支配数的一个对象图,说呢,支配数它体现了对象实例之间的一个支配关系,这个词的话呢,应该是比较形象的支配的嘛,就是我我支持你是吧,或者我管理你啊,你做什么,你得是我的一个这个这个。叫什么我的一个管辖,这就是支配关系啊,像我们通常说的这个监护关系啊,孩子呢,未成年之前,你得有这个监护人,那监护人呢,对你这个孩子的这个各种行为呢,需要有个监护是吧,就是你什么能做,什么不能做,这个受这个大人的一个直接的一个这个这个管理是吧,那么在这个对象的这个引用途当中啊,这里面提到了。
02:14
大家注意看啊,哎,这句话呢是最关键的,所有指向对象B的路径都需要经过对象A,那我们就把对象A啊称为呢支配的对象B。再说一遍,所有指向B对象的这个路径都需要经过A,好比如我们看这里边,嗯,比如说什么呢?比如说我们说这个。这个C吧。这个C呢,呃呃和这个E的一个关系,我们要想访问这个E,是不是一定要访问这个C,那那就相当于是我们这个呃C呢,就是E的一个支配者。那我们来看这个H啊,看这H说这个,嗯说谁呢?嗯说说这个E吧,这个E他是我们这个H的一个支配者吗。
03:02
嗯,大家看这个E是我们这个H的一个支配者吗。哎,我们说呢,其实不是对吧,为什么呢?因为我们除了这个E它能够访问这个H之外呢,我们这个D是不是也可以去访问这个H啊,那这里边儿的话呢,我们说E就不是这个H的一个支配者。啊,这个大家注意啊,就是你要想访问这个H的话呢,只能够通过这个经过这个E那才行啊,就是你要想跟这个孩子去建立联系,必须得通过他的这个直接监护人才行啊,就是你得通过他通过的那个人,其实就相当于他一个监护人,对吧?然后下边又进一步说,如果对象A是离对象B最近的那一个支配对象,那我们就成为对象A是对象B的一个直接支配者。啊,就是有,嗯,比如说我们这里边儿啊,大家呢,能够发现谁呢,比如说我们这个H吧。这个H的话呢,我们说,呃,咱们刚才说这个E跟这个D是不是都不算它的一个支配者是吧,都不算的话呢,这个C算不算呢。
04:02
那,那我们就来看,我们要想访问H是不是一定要经过C啊?事实发现确实如此。啊,确实如此是吧,所以这个C的话呢,它就是一个H的支配者,那我们看A是吗。A是他之威者吗?啊,我们要想访问到这个,呃,H的话呢,说一定要通过A吗?呃,是发现不一定啊,因为我们这个B是不是也可以对吧,所以这就不算,但是如果我们要是没有这个B了。没有这个B了,只有这个A指向这个C,然后再往下指,那这时候这个A是不是它就也是就是因有可能你其他这个用了过来之后呢,得先访问AA才能访问C,只有A才能访问C是吧?啊C呢就能访问H了,那这个时候的话呢,没有B的情况下,A呢就也是支配者,但是这两个里边呢,C呢应该算离得最近了,因为你看这个这个E呀D呀,是不是他们都不算了啊,这这就更不算了是吧,那他们既然都不算C呢,离它是最近的,那这个C呢,就叫做直接的一个支配者。这个有点像数学的这个概念一样哈,行,那质位数的话呢,它这个是基于对象之间的引用图关系建立的,它有以下的这个性质,哎,我们看看啊,大家能不能理解。
05:07
这三个大家能理解,那说明呢,对这个支配数呢,应该也算是比较清楚,第一个说对象A的一个子数啊,它的一个子数,就是说所有能够被对象A支配的这个对象那个集合,它表示呢,就是对象A的一个保留集。啊,你想想啊,它的一个指数能够被A支配的,就是只能只能是通过我这个A,你才能够去访问它下边的这样的一些对象,是吧,那就是那些对象呢,是不是必须经过他或者只有他才能够去访问得到,才能够引用得到,那自然而然的话呢,我们这个不就是个深堆吗。对吧,哎,深堆啊,深推的意思跟我们深堆跟咱们讲的这个对象实际大小区别不就在于说你要是内部的这个数据被其他的引用还能指向了,那不就不能算深堆里的了吗?咱们刚才那块讲的案例不也说的是,哎,你这个丽丽同学他一共有15个网页,但是其中呢,是不是有七个网页,这个被其他的这些,呃,这个这个Tom啊jery也能访问得到,这呢,是不是就算是这个呃,也能被别人访问到的,这个就不能算是我们这叫直接这个这个这个叫什么支配数了是吧?只有呢,15减七那八个才能是支配的。
06:12
啊,是一个植被数的关系,哎,我们它就相当于是呃,保存在这个深对里边了啊。下一个说,如果对象A支配了对象B,那么对象A的直接支配者呢,也支配对象B。这很显然的是吧,直接支配者哈,哎,比如说我们像刚才提到这里边这个C,它是属于H的一个直接支配者,那由于你这个AB都有的情况下呢,A跟B谁也不是他的这个支配直接支配者,但是你要把这个删掉之后,A是不是也是C的一个直接支配者了啊,要想访问C一定得经过A,那它还离他最近了,这是直接支配者,那这个A的话呢,是不是也是H的一个支配者了?对吧,哎,这没问题啊,下一个说支配数的这个边跟对象引用图的边呢,是不直接对应的啊,什么意思啊,就是你看这里边啊,这呢是咱们这个对象引用图啊,对象引形图的这样一个边指针,它指它,但是呢,我们在这个支配数里边,你发现这个F呢,我们放这儿了,H呢,这个在这儿呢,但是我们这儿呢却放到这儿了,那显然的话呢,是不是这两个是没有这种对应关系的是吧?哎,这俩注意一下。
07:15
好,那通过我们刚才讲解的这个知识啊,大家来看一看,哎,你能不能根据刚才我讲的这个内容,把这个图它的一个支配数画出来,也就是我们右边的这个。啊,你会画出来吗?如果能会画呢,那说明大家呢,掌握的应该还可以,好那咱们来一起分析一下啊,好大家来看,那我们首先来看这边啊这块呢,表示的其实就类似的,像那个比如说呃,一个根节点一样是吧,就是有可能呢,ABC呢,它是有别的引用所引用的啊,就是那个未知的一个啊是这样子的,好首先的话呢,你把这个A跟B呢画出来,它俩呢没有相关性啊,AB呢先画出来啊,就是这里边一个A啊,这一个B是吧?然后我们看这个C放哪啊,这个C的话呢,由于你看既可以用A访问,又可以用B来访问啊,你比如这块我们还有一个节点看,是相当于是这种的一个关系啊。
08:04
是这样关系了,这个嗯,这个C的话呢,既可以用A访问,也可以用B访问,所以A跟B呢,都不是这个C的这个直接支配数。啊,但是我们这个节点,这个节点是不是就是啊,因为呢,哎,我们只有比如这块还有别的这个指针访问,只有这个节点,要想访问C只能通过这个节点,所以呢,我们就把这个C呢,是不是看成是这个的一个直接支配数,它的一个直接子元素了,是吧?所以这呢,就这个元素就是它啊,然后它放这儿,那ABC它们俩就得是这样并列放了。咱们这是支配数的关系啊,这个你注意相当于这个元素是这个A也是B的一个直接支配数。啊,然后C呢,也是它一个直接制位数啊,所以就得这样放。这个应该理解啊,好,接下来。这个C的话呢,我们先看看比较简单的这边这一只吧,啊,因为这有一个双向的,所以不太好理解,我们先看这一支,这个C的话呢,我们接着往下看,我现在呢想访问这个E,这个E的话呢,大家看要想访问E是不是只能通过C。
09:04
别的指针你看这这块没有双,呃这个呢,要过来到这儿,这不是双向是吧?这不是双向,这也不是双向,要想访问这个E只能通过C,好所以这时候呃,所以这时候呢,这个呃E的话呢,那就直接在这个C的下边,C是它的一个直接植配数,好这呢就写在E了,然后再往下看这个H,呃,这个G,这个G的话呢,要想访问它是不是也只能是这样一条线过去,这边过不去的是吧?所以呢,这个呃E呢就是A,呃是这个G的一个直接支配数,所以我们这个G呢,就这样写,哎,那这一值呢,咱们就说清楚了。好,这只说清楚,好这只说清楚,然后再看,再看这吧,再往下走啊,H的话呢,这个我们说H还能再往下放吗?那我们想这个要想访问H,这个我们通过这个G能访问到,但是是不是不只是通过G啊,我们这边的已知是不是也行,所以说呢,你就不能把这个注意啊,不能把这个H呢放这儿了啊,这是错的,因为这边也能访问,所以这个G呢,不是H的一个直接植配数啊,接着那我们就来来看看这个HH,那这咋放呀,咱们先实际先放这儿,咱们先先缓缓再说啊,先不管它,先看这边啊,这边的话呢,我们要想访问这个D。
10:15
啊,你看通过C能访问,那这边呢,过去是不是这块去一个指针回不来,这个回不来的话呢,我们要想访问D是不是只能通过C啊,那C呢,是不是就是D的一个直接这位数,哎,所以这个呢,D就出来了。好,D有了以后呢,我们接着看这个F啊,要想访问F。注意啊,要想访问F的话呢,是不是只能通过D呢?事实上的话呢,你看我们D能访问F,你要这边过去的话呢,是不是这块差一个。回不来是吧,所以呢,要想访问F只能通过D,那既然只能通过D,那D就是它的离它又最近直接支配数,那这个F不就这样放了。没问题,好,那这个也搞定了,现在呢,咱们看这个H啊,这个H刚才说了这个F跟G呢,那这个G不是了,F我们看同样道理也不是,这都不算直接这位数,这也不是,哎,那进而的话呢,你看这个呢,这也不是是吧,因为这个呢,你访问这边我也能访问,说这个也不是。
11:13
哎,但是呢,你看再往上走,这个C现在就到C了啊,要想访问H,我们说必须得经过C。你看必须得经过C,不管你是走这一值也好,还是走这一也好,一定得经过C了,所以这个C就相当于这个H的一个直接植配数,那这时候我们就这样来访。哎,没有问题是吧,哎,没有问题,行,哎,这就我们相当于是由这个对象的一个引用图关系,然后划分成了一个支配数的一个关系,那划分这个有什么意义呢?大家看。有啥意义啊?啊,当然我们说有意义了,你想想如果啊,大家注意听,如果我们要把这个C对象给回收的话呢,是不是它下边这些呢,都得回收掉啊,因为这些结构呢,是不是只能是有我们这个C才能够访问啊。是吧,哎,是这意思啊,那你接着看,那我们要想把这个H给,嗯,别说H了,嗯把这个谁吧,把把这哥们吧,我现在想把这个G呢给回收掉是吧?哎,我想把这回收掉,除了你自己呢,这个数据被回收掉之外呢,说诶那H能不能给回收掉呢?我们看这个图你还得分析啊,因为你会发现这个H是不是还有别的指针指向了,所以H呢,不,不要给人家回收,这不算这个G深堆的一部分,H不算它深堆一部分是吧,那你要在这儿看的话呢,你要回到这,那你就自己挂掉就完了,H呢,人家在这儿呢,是吧。
12:30
哎,所以呢,我们这个质位数的话呢,其实那就对应我们这个关系啊,刚才在这说的知位数呢,在这儿是吧,A对象A就比我们这个C吧,它的一个子数整个就这样展开的,哎,所有被A支配的这个对象一个集合表示的就A的这个保留集及深堆啊下边不就是你这个堆吗。哎,就这个意思啊。好啊,这个呢,需要大家去理解一下,这个你要理解的话呢,咱咱们下边呢,哎,就可以在咱们这个里边呢,去做一个演示啊,针对于咱们说的这个还是student这个,呃,访问这个网页这个题目,然后这呢,我们就能够看一看它这个支配数的这个关系啊,咱们做一个点击。
13:06
好这就可以了,哇,这一进来之后呢,发现这里边儿这个数据看的还是挺多的啊。嗯,那这种情况下呢,我们就可以在这写个正则了,比如呢,我们是不是想看那个线程啊,咱知道里边有个主线程是吧?啊就在这儿呢,看主线程好,当然呢,大家也可以写那个,比如al list呀也行是吧?哎,可以都在这个主线程里的啊好,在这里边的话呢,我们这边对应的是不是有三个学生啊,这个你看叫Tom,这叫Jerry啊,这个呢叫Lily是吧?好,那我们还是看丽丽吧。注意啊,这时候呢,咱们看的不是那个,注意你看这时候呢,这个图它可不是那个对象的引用图啊。这不是对象图。你要看线程这块呢,这算是一个引用关系一样啊,这再再再说一遍啊,你看这个咱们那会儿看的这个啊,大家注意。这个得精神集中啊,这个呢,我们关于这个主线程里边,然后这里边在找这个Lily这个同学,这是Lily是吧?啊大家注意看啊,我再往下找,找到这个release的时候呢,这个release就是Lily同学他看的那个网页,他的网页呢,再打开大家发现呢,这块是不是一共有15个网页。
14:10
这块呢,就相当于是咱们这个对象图。啊,对象的一个引用关系,好,那回过来咱们还接着说这个叫这个支配数的这个图,这个图大家你看这个学生Lily他呢,有一个a release,我再往下打开,这是还是十再往下打开,大家注意了。一个两个345678,哎,是不是只有八个呀。啊,刚才呢,我们在这个thread overew这里边看到15个,而这呢只有八个,哎,为什么只有八个呢?我们跟这是不是就对上了。大家看这咱们刚才呢,讲这个案例的时候,不就说了,一共呢,你有15个,但是呢,有七个呢,是不是被三跟五那两个,就是一个Tom一个Jerry也能够访问到,哎,15减去七,是不是只有八个是人家这个丽丽同学他自己所独有的,也就只有丽丽同学才能够访问的八个网站,哎,所以呢,咱们这里边展现的是不是就是八个呀,那也就是说呢,咱们要想考虑这个,呃,回收内存的话呢,我要是把这个丽丽同学给回收掉了,那你是不是只能回收这八个,这个数据不涉及到你那七个数据吧。
15:16
哎,这就是支配数的一个概念啊,支配数的概念好,哎这呢,咱们就把这个概念呢,就哎说清楚了,好,那整个来讲的话呢,就是我们这个呃MAT呢,分析这大文件呢,它这里边这个功能呢,应该算是呃相较于这个呃几康so啊,或者说VSOVM呢,包括我们后边讲这些工具来讲,它还是比较强大的啊这个很细致里边的一个内容,OK,这个呢,我们关于支配数呢,就先说到这儿。
我来说两句