00:00
那关于我们说这个g first垃圾回收器,它的一个使用场景啊,就是在实际生产环境当中,我们呢,就先说到这儿了,那这个结束以后啊,咱们先不着急呢,给大家去讲说这个j first垃圾回收器到底这个让JC,还有这个老年代这个JC具体的过程是什么样子的,在讲这个之前啊,咱们呢,呃,想给大家呢,再稍微的说一下,这个叫region,毕竟的话呢,我们说这个g first垃圾回收器在原有的我们那个分代的体系之下了,我们说很难有突破了,就以前我们讲的那些垃圾回收器很难再突破了,那这时候我们这个g first完全跳出这个概念,提到了一个叫做region分区的一个概念,也正因为我们有了region,才引出了分区算法,才引出来了我们后续的一切啊,我们能够达到一个可控制的一个暂停时间的基础上呢,这最大程度的提高这个存储量,那你怎么能提高可控制这个时间呢?我们不再是原有的一块,呃,一块区域,说这个区域呢,就纯粹呢,是叫这个伊甸园区,纯粹的叫survivor区,那纯粹的叫老年代,你这个时候回收起来呢,实际上这。
01:00
这个时间呢是很没有保证的,我们现在把它打散了,叫做region对吧,所以这块呢,我们这个再来介绍一下这个region这个结构。这儿呢,用了一个词叫做化整为零,也可以看成是个成语了,嗯,这个词呢,应该我查了查,这个最早呢是这个这个毛主席使用的啊,在这个抗日战争的时候呢,我们说这个咱们说我党的这个势力呢,相对弱一些,所以主要呢,在北方呢,组织的叫游击,对吧,那游击的时候呢,我们说叫化整为零,就是把这个咱们的一些队伍,包括一些这个工农子弟兵啊,就是分散开,大家呢就打游击战啊,让这个日本鬼子呢,就不能够直接呢去歼灭我们整体的这个力量。啊,其实现在的话呢,在像阿富汗战争啊等等,其实这个他们也借鉴了这个主席当时提的这样的一些想法是吧,诶所以现在呢,就是在这个中东那块儿呢,好多这个恐怖分子,你根本就没办法把他们消灭掉,那它分散开了啊,根本就不像打这个规模战争一样啊,就没办法把他们全搞定,这叫化整为零,那用这个,那另外的一句话说呢,这个以前呢,上学的时候呢,说过这句话啊叫什么聚是一团火,呃,散失满天星是吧,那你可以理解成呢,这个化整为零,这个整呢,就是相当于一团火,把这一团火呢我们散开,然后呢就是诶满天星就现在呢,就把它散开的意思,原有的时候呢,我们是这呢叫新生代,这呢叫老年代,是不是一整块的这个空间啊,我们称为呢,叫逻辑上呢是连续的对吧,那现在的话呢,我们把它呢,打成一块一块的,那一块一块的就是一块一块的这个region,所以呢叫做化整为零,就是把这个整块呢,我们分解成一小块一小块的,就这个意思。
02:33
好,那么在使用这个j first的时候呢,咱们把整个这个堆空间啊,划分成了叫2048大小的这个region区域,这个呢,咱们那会儿也提到了,就是你只可能选择叫二的N次幂啊,一兆两兆,四兆,八兆,十兆,32兆啊这样的一个场景。咱们呢,也可以通过刚才讲的这个叫hi啊region size这个参数呢,去做一个设置,对吧?就可以了,这里边需要注意的就是咱们设置的这个所有的region啊,它的大小都是相同的,在整个这个GM这个生命周期之内都不会改变,就相当于呢,你当前这个应用程序一旦使用了这个参数的话,诶它就呢,诶不会改变了,除非呢,你把当前这个进程停掉以后呢,再重新运行,你可以呢,重新再指定一个值对吧?诶就这意思,下个的话呢,就是我们提到这个新生代老年代的话,我们要求呢,它是这个逻辑上呢,它得是连续的,对吧,那事实上的话呢,我们这个region的话呢,就不做这样的要求了,那我们看到呢,就是这样的花花绿绿的。
03:22
有点像呢,以前的时候那个马赛克一样,就是厕所的时候贴的那个小瓷砖是吧。哎,就这样一个场景,那我们看到这个E的话呢,它表示的就叫伊甸园区,你看它并没有说连续的就是很多个E,而是呢分散开了,所以这个呢,我们就称为呢叫逻辑上呢,他们也不再是连续的了。嗯,就这样的一个场景,OK,然后下边呢,我们针对于这个场景的话呢,咱们做一个简单的一个介绍,简单来说的话呢,我们这个region呢,就分成这样的几个角色,那有这个叫伊啊,就伊甸园区,还有survivor区,本来呢,这个survivor区呢,我们说这个from区,Two区,它的角色也本身也是可转换的,所以我们这呢,就不会再标明说哪个叫S0,哪个叫S1的就没有意义了啊这个survivor区,然后呢,Old区或者叫ten的啊,就是养老带老年代都可以,然后呢,还有这个叫啊humans啊,这个呢是一个句型对象。
04:11
那用这个首字母H呢来表示的。嗯,H来表示的,OK,那我们来看一下下边这个介绍,说呢一个region啊,它只有可能属于这几个角色之一,当然这个H呢,也算是其中一个对象啊,一个角色,那个一个region呢,只能属于一个角色,言外之意呢,就是我们这个,比如说绿色的这个区域呢,这个region震他充当了叫伊甸园区,说能不能分一半呢,说一半呢是伊甸园,一半呢是这个O的区啊,这个是不可以的。这一个region震的话呢,他的这个角色呢,是非常的单一的,只能是选一个啊,这个大家要注意一下,但是这里边呢,需要说明的就是说,虽然说在当前呢,它只能是充当的叫伊甸元区,但是它这个角色呢,是可以转换的啊,不是说呢,在整个我们GM生命周期之内说它不能变,它是可变的,比如说呢,我们当前的这个伊甸园区,如果当它接近于满的时候呢,我们说要进行这个央JC,那央JC的话呢,一评判它的这个价值又比较高,是吧,我们就优先回收它了,那么把它回收完以后呢,它整个就空白了。
05:07
因为呢,它这个数据呢,是不是要我们提升到这个survival区是吧,Survival区的话呢,它整个就是复制算法就过去了,然后这个呢,就给它清空,那清空完以后的话呢,我们会把这个呃region振呢,会放到我们说叫这个空闲的列表中,就是我们有一个列表呢,专门来记录这些空闲的这个region振,那空闲以后的话呢,那下一刻它有可能从这个列表里边呢,就把它又选出来,让他呢充当这个叫old了。啊,也就是说呢,他在清空以后呢,它是可以再变换角色的,但是在他这个存活的这个期间之内呢,他不可以装好几个充当好几个角色啊,这个大家注意一下这个问题。对吧,哎,注意现这个问题啊,行,那这呢就是我们上图的一个颜色,大家呢,应该很好区分啊,这个就不多说了,然后的话呢,我们又提到了一个叫humans这样的一个叫句型对象,或者我们也称为它叫做大对象。那叫做大对象,嗯,这呢,你会发现呢,这个大对象呢,怎么叫大对象呢?就是如果我们存储的这个对象,比如说啊举个例子,咱们这一个region呢,假设就是四兆,就是四兆,现在呢,你突然整了一个挺大的一个对象,比如说呢,内存中的一个,你加载了一个图片,这个图片呢,就比较大啊,或者说呢,我们这就是一个字节数组是吧?这个数组的话呢,比如说我们有这个七兆,嗯,七兆,那我们这一个锐震呢,是四兆,那你现在是七兆,显然呢,是不是一个锐振乘不下了,那乘不下怎么办呢?这时候我们就要考虑呢,使用这种大对象了,那什么时候用啊,这块也有要求,就是你得达到呢,我们1.5个这个region的场景下。
06:30
达到这一点,五个日点的长向,这显然是到了,那我们就可以把这个气兆呢,放到我们这个叫human马S这样的一个区域当中啊,这样区域当中OK,它呢主要是用来存储这个大对象的啊,这个大家注意,那么关于这个大对象呢,我们再说明一下,说为什么我们要设置H呢。你看这里边儿,我这个描述。说对于这个堆当中的这个大对象啊,咱们前面也都讲过这个垃圾回收的这个算法,讲这个堆空间的时候呢,其实说过啊,就是说针对这种大对象呢,我们默认呢,会直接呢,是不是把它分配到老年代啊啊因为呢,这个伊甸园区,这个survivor区,Survivor区显然呢,是不是都盛不下了,要能城下这就不叫大对象了,它盛不下呢,我们说大对象是不是直接进入老年代。
07:09
对吧,诶说过这个问题,那如果呢,这个大对象呢,放到老年代的话呢,但是这个对象呢,它是一个短期存在的大对响,这个时候呢,是不是显然对我们垃圾回收器的造成负面影响。相当于呢,就是我们把一个这个短期存在的一个对象呢,把它放到一个老年袋,老年袋呢,是不是垃圾回收的这个频率呢,又比较低是吧,那回收频率比较低,那或者说呢,它存活时间很长,那很长的话呢,一定程度上它就有点像我们说的一个宽泛意义上的,是不是叫内存泄露啊。对吧,本身没必要这么长时间,结果你看它存储时间很长,这个对垃圾回收呢,造成一个负面影响,因为呢,它始终呢就占据这个空间了,说为了解决这个问题怎么办,我们画出了一个叫啊Q格S2个区域,专门呢用来存储这个大对象的。哎,称着大家就想,那也有可能说你这个H区说它都装不下,一个区都装不下怎么办啊,这个时候我们就会寻找叫连续的这个H区呢,来进行一个存储。
08:03
这个时候注意我们是得连续的啊,有点像比如说我们这一个城下,我们就连续的这个H区去存储我们所谓的这个大对象。啊,那如果说连续的H区找不到怎么办呢?这时候我们就可以启动一下叫for了,没办法了,这时候我们要重新整理一下这个内存空间是吧。啊,这一的大多数行为呢,都把这个H区呢,咱们充当叫老年代呢来看待,呃,大部分时候呢,都把它充当老年代来看待,就是呃回收的嗯不那么频繁是吧,当然呢,这个区域呢,我们也是有别于这个老年代的啊,我们是专门的有一个区呢,就叫H区,跟我们这个O呢,它是一个并列关系,这个大家注意一下。OK是吧,行,然后这块呢,我又放了一个图,这呢就涉及到我们这个reason的这个细节了,这个细节这块呢,我就用两个词呢来表示,大家呢就应都应该清楚,因为前面呢,我们都涉及到过相关的一些这个知识点了,诶涉及到过一些相关知识点,就是这儿呢,是针对于咱们这个region,正常的话呢,比如我们放的这一个region呢,咱们是这个四兆是吧,那四兆的话呢,实际上我们如果只是放一些变量的话呢,还是能够呃或者一些对象了实体,你是还是能够放很多这个实体的,那这个放的时候呢,我们还是那这个呢,就是把它们依次呢这样去去摆放,所以这块呢,是不是就有个指针呢,这个指针就记录了你当前使用了的这个是这个allocate是吧,就已经使用的这个这个区域,然后呢,还有未被啊安unoc就是没有被分配这个区域,这个指针呢就在这儿,然后当你这块又分配一个新的对象的时候,或者几个对象的时候呢,把这个空间呢给它占用了,这个指针呢,是不是就往右移啊,所以这个呢,就是咱们所说的是不是叫指针碰撞。
09:35
啊,这个我我用英文来写了,指针碰撞就是这个意思。啊,这个这个写一个中文吧,指针碰撞啊,这就这这这一个意思。急。嗯,指针碰撞前面呢,咱们说到过对吧,关于这个对象的一个分配的话呢,就是无外乎两种方式,一个呢叫指针碰撞,是不是一个叫空间列表啊,那对于我们说这个内存呢,没有碎片化的问题呢,我们都用的叫指针碰撞啊行,然后下个概念呢,叫TLB。
10:03
这个应该不陌生吧,就是我们相当于这是对空间了,对空间你这个是很多的这个region,针对这一个region的话呢,我们有很多个线程都要使用,那怎么办呀,我们在这个region当中也可以去分配,叫TLB,就是单独给某一个线程是吧,每个线程分配一小份,然后呢,这个时候呢,大家在共享的时候呢,是不是就可以考虑这个叫可以并行的去执行是吧,那用不着呢,说我们是一个同步的一个概念,所以可以提高我们分配对象的一个效率。哎,这个呢,一说大家应该都比较清楚。啊都比较清楚,好,那这呢,就是关于我们这个region的一个理解啊,涉及到我们这样的一些点啊,行,我们就说到这儿。哎,我们就说到这哈,就大家呢,会发现咱们讲这个这first的时候呢,其实好像这个文字的信息居多是吧,我们在这个代码上体现的实际上是不是比较少啊啊因为这里边我们主要呢,就是讲他这块的实施的一些细节啊,包括呢他这块设计的一些细节点,所以代代码上的话呢,体现其实就是我们在开发当中,你呢去诶看看什么场景下你用这个g first,那剩下的事的话呢,你就直接交给我们这个垃圾回收器,它去实施就可以了。
11:07
所以我们这个文字呢,就会多一些哈,包括呢,大家去网上看这个一些书啊,包括一些这个帖子啊,其实里边多数还都是一些文字性的,更多的就是我们根据这个文字性的,对整个这个j first有个全方位的一个理解,然后指导我们呢,诶在开发当中诶去使用这个g first就行。啊,这数就行,代码上呢,其实体现无外乎就是我们来设置一些参数而已,对吧。行,这呢,就是我们说清楚了,关于这个region啊,它的一个介绍。
我来说两句