00:01
诶,接下来的话呢,咱们看这个概念叫做深堆与浅堆,诶咱们在刚才看这个,呃,大部分文件的时候呢,咱们讲这个黑ogram啊,这里边大家会注意到有两个词,一个呢叫shadow keep,一个呢叫return keep,咱们分别呢,给它名字呢起为这个叫浅堆,这个呢叫深堆啊诶当然呢,你会发现呢,就是关于这个浅堆和深堆的话呢,是不是永远都是这个浅堆,它不会超过我们这个深堆吧,顶多呢跟它是相等的是吧?哎,它不会出现这个浅队比我们这个深蹲还大的情况,一深一浅,那这两个概念呢,如果大家清楚,咱们Java里边呢,叫浅拷背,叫深拷背的话呢,哎,其实呢,算式一一对应的,那么大家再理解这两个概念呢,应该就会更简单一些。好,那首先的话呢,我们把这两个概念呢,给大家说清楚,然后呢,咱们通过一个案例呢,诶给大家去讲解一下,我们为什么看到,诶这个数据当中相应的这个对象啊,它这个大小A为什么是这么多,诶这个为什么这么多是吧,我们就可以呢进行。
01:01
进行一个解释了,好,那首先的话呢,我们说一下这个叫浅堆。浅堆注意听啊,浅堆呢,是指一个对象所消耗的一个内存。在32位系统当中,注意32位系统啊,一个对象它引用呢会占用,引用会占用四个字节,一个in的类型呢,也是四个字节,Long类型呢,哎,就是占八个字节了,这个咱大家应该都很清楚,它涉及到一个呢,叫做对象头啊对象头这个对象头呢会占用八个字节,那对于我们一个对象来讲呢,它把它内部的这个结构加一起之后呢,还必须呢,我们说是八字节对齐的啊,也就是说你最终的这个合起来的一个总数呢,要能够被八除尽的意思,那除不尽的话呢,那你就补齐啊,补齐就可以了,那这呢给大家举个例子啊,注意咱们这个举例子的话呢,是以JDK7当中的这个string啊来给大家举例子的,GK8呢,就跟这个有变化了。那在G7当中,我们在这个string内部啊,有三个非常重要的这个这个属性啊,或者叫成员变量啊,一个呢叫哈希32,一个叫哈希好,那它内部的话呢,这两个in的类型我们说各自占四个字节,那就相当于它呢,是不是就八个字节了。
02:09
OK,然后呢,这个引用那我们知道呢,String底层呢,是有一个差型的一个数组嘛,是吧?哎,那这个数组呢,叫做value,这个引用类型的话呢,它是本身也占四个字节,然后对象头呢,是有八个字节,那么这样加一下是不是就是20个字节了。啊,加起20个字节,因为呢,我们说得是跟八字节对齐的,所以呢,这除不尽,那我们需要补齐,那就补到24了,那也就是说呢,在我们这个JDK7当中啊,咱们这个缀呢,它要是存储的话呢,需要用到24个字节,那这里边所谓的这24个字节,注意就是咱们所谓的缀的浅,缀的大小。潜率的大小,那也同学会说,老师这里边我们这个Y呢,也没说它存储的值啊,比如说我们这个Y,如果存的值叫hello,跟我们这个Y的存储的值呢,叫hello word,那我们string的潜力大小都是24吗?哎,通过我们刚才这个概念来讲解,是不是全都是24啊,因为呢,我们跟具体这个Y6的这个值是多少呢,是没有关系的啊,就是它呢是一个引用了,我们不关心它距离存储的数据,咱们只关心的这个引用占的大小,你要关心这个数据了,那就不是一个浅堆了,就是一个深对的问题了,是吧?哎跟深对相关了。
03:20
好,就是跟我们这个Y6的距离取值呢没有关系,不管你多长多短,我这呢只存一个引用嘛,所以这就叫做浅堆大小。应该还好是吧,我觉得应该还好啊,大家应该比较好理解,行,那接下来的话呢,咱们看一个相对来说麻烦一点的概念,叫做深对啊深对的话呢,这个概念就稍微的复杂一些,咱们要想把这个深内呢解释清楚先呢,我给大家说另外一个概念叫做保留级。哎,咱们给大家把这个保留级这个概念呢,先说清楚啊,Returned set啊。好注意听啊,注意听,实际上呢,懂的话呢,并不难啊,但是你注意听第一次这个这个不会的话呢,先把它弄明白啊。说对象A它的一个保留集是指什么呢?就是当我们这个对象A被垃圾回收以后,可以呢,被释放的所有的对象集合,包括它本身是吧,也就是说这个对象A呢,它的保留值,保留集呢,就可以被认为是只能够通过这里边非常关键啊,这个只能非常关键。
04:19
只能够通过对象A被直接或间接访问的所有对象的一个集合。哎,通俗来说就是只被对象A所持有的对象的一个集合。那那就说一个这样的例子吧,比如我这个字符串叫S1,刚才说了我们有一个哈希的一个,呃,32这样一个变量,还有一个呢,哈希的这样一个变量,还有一个呢,是不是叫Y6这样一个变量啊?OK,没问题是吧,好,这个归你,这个归你,这个归你,一共呢,你身上占24个字节,这是你的浅堆,现在呢,我有个S2啊,同样的还有一个哈希32也有一个呢,哈希也有一个这个Y6,哎,那如果我们知道这个常量池的话呢,它诶是不是共用这个Y6的实际上一个数据了啊,比如我们这个就叫做哈。好,这两个value呢,都指向哈路了,哎,都指向哈路了啊,那这个时候的话呢,我们说呢,这个保留极,保留极的话呢,就是它涉及到了,呃,我们要回收它,那这里边就涉及到这个VALUE6里边这个哈会不会回收,如果说注意啊,我没有这个指针。
05:16
所有在内存空间当中,哎哈呢,只是只能由这个,那这块只能是吧,只能由我们这个VALUE6呢去指向,那么我们计算这个S1它的一个保留级的话呢,就应该把这个哈的大小呢给它计算在内啊,因为这个哈呢,是不是只能够被我们这个S1的Y6所访问是吧?哎,那我们就应该记录到里边,它就属于这个保留期的啊呃,那但是呢,要是S要是S2呢,也能够指向这个hello这个时候的话呢,呃,我们要是想回收S1,那这个hello呢,是不是就不能够被回收了。因为呢,S2还要用呢,是吧?啊,那这个时候的话呢,保留级当中就不能够再去包含这个hello了。哎,通俗的讲呢,就是我们这个,哎,能够这个被回收的这个数据是吧,哎才能够是成为这个叫保留级的。
06:03
啊,那你看下边这个现有这个保留级的概念啊,然后呢,深堆就是值对象的保留级当中所有的对象的浅堆的大小之和。啊,所有的对象的前列大车说这个啊,这里边你注意我们刚才提到一个直接,还有这个间接啊,就是我们通过他呢,访问一个谁访问谁还能再访问谁还能再访问谁啊直接或间接的这一串,只要呢,这一串当中的某每一个对象只能够被S1访问到,那我们这都要计算上啊,这都算是这个深对里的,那凡是有一个变量呢,可以通过另外一个途径呢被访问到,这个呢,就不应该再去被计算了。啊,就不应该算深对底的,也就是说呢,就不应该,哎是不是在你回收一的时候呢,这个对象就要被回,呃被回收,因为还可能被别人引用呢,是吧,哎,这个意思啊。好,那这里边你看写的这个,注意说那个浅堆呢,是指这个对象本身占用的内存大小,不包括呢,其内部引用对象那个大小,像string的那个Y6是吧,那一个对象的深对呢,就是只能够通过该对象访问到的直接或间接的浅对之和,啊就就就这意思是吧,哎,浅对之就是我们的这个深率。
07:09
哎,所以说呢,这个肯定是要大于不小于吧,不小于我们这个,呃,前堆是吧。啊,当然也有可能等于嘛,啊,也有可能等于啊。行,那即对象被回收之后呢,可以真正释放的一个真实的空间,因为你只能被我们这个对象直接或间接的访问嘛,只能是吧,那相应的你就也一块跟着就被回收了啊。好,这个呢叫深,对,呃,那这个可能有的同学呢,还稍微有点迷糊,咱们下边有这个案例啊,那这个案例里边呢,再给大家补充一个概念,这个对象的实际大小。那这个呢,大家可能会更容易接受一些啊,什么叫对象的实际大小呢?就是呃,被定义为一个对象呢,它所能触及的所有对象的一个浅对之和,那注意你看这里边提到了叫所能触及的。哎,咱们刚才呢,提到的是不是说只能通过它访问的是吧,就是只能通过它,你就只能通过它触及的啊,这呢是所只要你能触及就行,不一定是只能通过它了。
08:06
啊,这呢,就是我们通常意义上所说的对象大小啊,通常意义上所说的对象大小,那与深堆相比。啊,与深队相比,这个呢,在咱们日常生活当中,开发当中是吧,可能更直观一些,更容易去理解,但是呢,注意这个概念呢,跟咱们说的垃圾回收是没有关系的啊,没有关系的,好举例子啊,大家呢,看到我们下边这样一个图形abcde,这一共是五个对象啊,都是对象啊,通过A呢,引用了C和DB呢,引用C和E行问一象。A对象的一个浅对大小是不是就是他自己?没问题是吧,那就你自己啊,里边该有引用,你就计算这个引用的大小就可以了,好,那接着问这个A的一个深堆的大小。哎,深对啊好,那我们看,哎,首先A自己它的这个潜力大小我们要计算在内,然后呢,它跟B没关系,不用管了,它呢只引向了C,只引向了这个D,那我们看C和D是不是呢,只能由A啊所引用啊C的话呢,发现是不是不是啊,因为B是不是还能指向啊,由于这个B的这个指针的存在呢,导致我们这个C啊就不能算在A的保留期内了,或者呢,就不能算成A的这个呃深对的一部分了,那这个B呢,我们发现是不是只能用这个A指向啊,B呢指不了,所以呢,这个A加上这个D就是我们A的一个深率大小。
09:29
啊,就是A的深度大小,那么A的实际对象的大小是多少呢?A的实际对象大小就是由它只要能触及到的都算,那就是ACD,他仨加一起是不是就叫做我们A的对象的实际大小了。啊,那B呢,大家也同样的道理去分析就可以了,行没问题是吧?好,那这块呢,咱们再给大家举一个例子啊,这相当于是个练习了,这个练习是这样子的,这呢是我们这些root啊,这呢也是个对象啊,这也是个对象对象对象这一共算是五个对象啊,那这里边我们问一下这个A它的一个浅对和深对。
10:04
哎,A的浅对深对,好A的浅堆就他自己A的深对呢,它是不是也没有去指向别人呢?所以A的浅堆和深堆呢,它俩是相等的。对吧,哎,相等的就他自己啊,浅推深推就他自己啊行,然后呢,呃,接着我们来看这个B啊B的话呢,浅堆就他自己B的深,对呢哎,我们发现呢,B指向了CC呢,只能用B来指,所以这呢也算上B呢指向了D,但D呢,不是不是只有B能指这个,诶是不是这也有个指针也指向了,所以说呢,B的深率大小就是它加上C。哎,B加C啊这俩好,那不能加它是吧,你要说B的这个实际对象大小加上这个D是OK的啊,那接下来的话呢,我们把这个呃指针呢给它擦去了,擦掉之后这个时候呢,我们这个B的一个深度大小,是不是就BCD加一起就行了啊,因为呢,这个D呢,也只能是由我们这个B才能访问得到是吧?哎,所以他仨合一起呢,叫做实际的一个,哎,呃,就叫做我们这个深度的一个大小了啊。
11:06
当然了,这个时候的深对大小和我们这个实际对象的大小是一样的是吧?啊是一样的啊,都是这个BCD好这呢是我们说的这个深对和浅堆这个概念啊,大家先能把这个清楚,然后的话呢,咱们带家去分析一个案例啊,通过这个案例呢,我们看一看,诶为什么里边相关的一些数据呢,是是那个数啊,大家你就能够明白了,那这个数到底怎么算的了,就啊好的。
我来说两句