00:00
那我们讲完这个remember set之后啊,咱们就开始给大家讲一下这个这first垃圾回收器呢,回收的具体的这个过程,那据这个过程呢,咱们刚才强调过说呢,包含叫年金贷GC年金贷和这个老年贷的一个并发标记的过程,以及呢,我们说叫混合回收,这个时候呢,混合回收其实我没有写清楚,呃写这个具体特别明确哈,实际上呢,就是包括我们这个叫样JC,就是针对我们这个新生代的,以及呢,针对我们这个老年代的一个垃圾回收,诶实这两个合在一起呢,咱们称为呢叫做混合回收,所以呢,大家你会发现一个现象,就是说我们这个样JC的话呢,是不是在我们的第一个环节,第二环节和第三个环节是不是全都出现了呀,包括呢,我们这个可选的这个for jc,那肯定呢,进行全堆的一个回收,也包括我们的新声代了,对吧,那为什么会是这样的一个场景呢?这呢,其实就跟我们之前讲的,说频繁的收集这个新生代呢,实际上呢是吻合的,哎,是一致的,那我们出现老年代垃圾回收的机会啊,实际上是比较少的,那大家还记不记得我们那会儿举了一个例子。诶,那会举个例子说,在我们这样的一个配置的场景下啊,每每分钟呢,有1500个请求的场景下呢,咱们每隔45秒钟是不是就会发生一次叫样GC啊对吧,就发生一次样CC,也就是我们这个样JC呢,你看发它发生的这个频率啊是极高的,而我们这个呃,每隔31个小时,就一天多的时间呢,我们才会使得这个堆空间的这个使用率啊,达到45%,达到45%的话呢,我们老年代才开始进行这个并发标记,进而的话呢,才会实现我们的第三个环节叫混合回收。
01:30
那这个for这些的话呢,我们轻易的说是不会出现的,对吧?哎,当然也不是说一定不出现啊,咱们最后也会讲一下说什么情况下呢,会导致我们这个for GC的一个发生啊,我们想强调一个点呢,就是说咱们这个样JC的话呢,是出现在这里边的每一个环节当中的,因为它发生的频率呢,是比较高的是吧,这个大家要注意一下,行,那我们首先呢,就来看一下提到的这个叫年轻代的这个GC。说这个GM在启动的时候呢,这个呃,G first它就准备好这个伊甸园区了,当我们程序在运行的过程当中,就会不断的去创建这个对象呢,到伊甸园区,这跟咱们以前讲的这个堆空间的这个概念是不是都是吻合的呀,对吧?然后什么时候我们会进行这个样这些呢?咱们说唯一的一个条件呢,就是到我们这个伊甸园区的这个空间耗尽的时候,这个注意啊,那咱们前面呢,遇到过这个问题,那我再问一下大家,我们这个新生代的话呢,这个年龄带这些肯定是涉及到伊甸园区,是不是和这个survivor区都要进行回收了,对吧?那么我们这个伊甸园区呢,满的时候我们会触发这个样JC,那我们这个survivor区,它有没有主动触发这个样JC的这个可能性呢?
02:31
诶这个注意呢是没有的啊,这个一定要注意是没有,就是只有我们这个伊甸元去呢,它在这个内存不够的时候啊,或者叫空间耗尽的时候呢,我们才会触发这个叫样JC,那在触发这个样JC的时候呢,或者叫mini jc对吧,咱们这个survivor群呢,也跟着呢进行了回收,就是它呢属于这个被动的是吧?诶被回收的这个呢,就是主动的由我们这个伊甸园区导致的,我们的这个主动的一个触发的这个样DC啊,这大家要注意一下。然后这个年液代垃圾回收的话呢,就会回收伊甸园区和urvival区,这个呢,写到这儿其实都有点侮辱大家的智商是吧?诶咱们新生代不就这俩区嘛,然后这个样这些的时候呢,首先这块提到了说我们这个j first呢,它会stop the word,就是我们这儿呢,实际上是一个独占式的,嗯,这个垃圾回收这个J1呢,它就创建垃圾回收集,那回收集呢,就是我们要回收的这个内存分段上的这个集合。
03:23
啊,这时候呢,我们主要回收的就包括这个新生代,呃,这个伊甸园区和这个svival区的所有的内存分段,啊这呢就是一个概述啊,咱们下边呢,有这个详细的过程,那简单的我们先来看这样一个图。哎,来看这样一个图,就是看大家猛一看是不是感觉有点绕是吧?我们这是两图啊,上面一个下边一个,上面这个呢,就是我们回收之前的这样一个环节,下边呢就是回收之后,哎大家呢,回忆一下我们前面讲这个对空间的时候呢,是不是提到过说这个新生代的话呢?呃,新生代里边这个伊甸园区,它呢,进行这个样DC的时候呢,它这个数据是不是要进入这个叫survival区是吧?那urvivval区呢?呃,现有的这个呢,我们都可以称为呢叫from区,那么这个伊甸园区存活的对象以及呢,我们这个survivor区中判断以后呢,也是存的对象,你看呢,就是这里边的这个这个还有这个他们仨呢,诶共同的在这个空闲的这个区域,这个保存下来就注意这块用的是复制算法,然后保存下来以后呢,这就是我们,呃,所谓的就是你放到这儿,这就有点像那个叫兔取了对吧。
04:17
这个呢是一个空闲的,这个空白的,我们呢,把它就诶充当那个叫survival去了,这个呢就固定到这儿了,保存起来,那原有的这几个空间呢,因为咱们使用的叫复制算法嘛,复制完以后呢,就是诶这个空间,这个空间还有我们的这个空间啊,它相应的就会做一个这个诶该清空的就做一个清空处理啊是吧,来做个这个清空的处理,OK,然后的话呢,我们注意的这里边还涉及到你看诶当然这个呢也一样是吧,这个这个这个跟他一样啊,也都是放在这了,然后这个呢,Survivor区这个有可能是达到这个阈值了,对吧,它达到这个阈值的话呢,我们说是不是直接呢就可以进入到这个老年代了,是吧?哎,这就我们这个叫O。诶注意一下这样一个情况,就这呢,实际上是我们之前在讲对空间的时候呢,已经说过这样的概念,只不过呢,当时我们是分带这块呢,像是一个分区是吧,一个一个的region。
05:06
好,那下边的话呢,咱们看一下这个年轻代这个垃圾回收的这个过程啊,这个大家猛一看呢,感觉哇好多呀,哎,这个过程呢,注意不用咱们去死记硬背诶不用去死记硬背啊,主要呢,大家去熟悉一下我们这个过程就可以了啊了解一下。那么这个新生态这个回收的话呢,是这样子的啊,其实呢,我们刚才讲完以后呢,也基本上清楚了,只不过呢,这个细节呢,描述的更加的细致一些,首先的话,我们会去扫描这个根。哎,扫描这个根,这个根的话呢,就是我们说的这个GC root是吧,主要呢,指的就是针对的就是我们像这个静态的这个变量,你可能会引用我们这个,诶新生态里边的这样的一些数据嘛,对象是吧?诶static这个变量引用的对象,还有呢,就是在我们这个方法调用的时候呢,涉及到这个叫局部变量,连同我们刚才提到的叫呃记忆级。对吧,还记一记这块呢,为主要呢,就是提到我们这个年龄贷这个GC的时候呢,咱们是一定要用到这个记忆记的。一定要用到这个记忆机能理解吧,啊大家你看哈,咱们这个新生代呢,它的回收是很频繁的,它有可能是不是被这个老年代的这个呃指针呢所引引用是吧,就我们叫引用了所指向,所以呢,这个时候呢,有些这个新生代中的这个数据啊,你就不能够随便的去回收。
06:15
那就不能随便回收,而对于我们这个老年代这个对象,你说我们回收的时候会不会考虑说新陈代谢指向它呢,这个呢就不用特别担心了,为什么呀,因为咱们啊,再回过来啊,咱们在这个老年袋回收的时候呢,是不是本身我们要回收这个这个年轻袋啊。诶,那回收这个年轻带的时候呢,本身咱们是不是就要进行这个GC roots的一个判断是吧?诶JC的判断,所以说呢,这块呢,就是回收老年代的时候,你不用特别担心关系呢,就是我们年金贷这块呢,频率很高的,在回收的时候呢,你要担心是不是被老年贷这块呢所指向,所以呢,我们上面不是引入这个叫G一级的一个概念吗。对吧,诶这块呢,我们这个跟引用这块还需要考虑上这个机机,OK,然后下边呢,我们还涉及到叫更新一下这个记忆机。哎,更新一下我们这个remember the set,为什么呀?这里边提到一个叫做哎dirty card的Q,就是脏卡表,哎脏卡表我们先把这个事儿先说清楚啊,这个处理这个脏卡表里边这个card,然后去更新一下,我们这个叫ret啊,我就叫ret了啊,再记一记,然后这个时候呢,我们才能够使得这个ret能够准确的去反映老年代对所有的这个内存分段中对象的一个引用,那这呢,咱们主要的指的是新生代这个内存分段,诶这个对象的一个引用。
07:28
啊,那这个呃得块的Q是吧,它呢是一个什么结构呢,我在这块呢,就是为了不破坏咱们整个这个结构啊,我写到这了。什么叫这个张卡表呢?张卡表队列呢,是这,呃张卡这个队列呢,是这个意思说对应的我们说的应用程序,比如我们有这样的一行代码,那这一行代码的话呢,我们就相当于给这个引用的这个属性赋了一个值啊,这个赋值呢,它有可能是我们这个是不是新生代中的一个实际上的一个对象,是这意思吧,嗯,那么GM呢,它会在这个,呃,这行代码执行之前和之后呢,它做一个特殊的一个操作,这个操作呢,它就记录到我们这叫德t card q当中了。
08:06
啊,记录到这里了,然后呢,我们在这个回收的时候呢,需要呢,根据这个啊dirty card q呢,我们去更新一下这个asset啊等于asset,那保证呢,就是我们这个asset呢,反馈的是真实的一个这个应用关系。啊,引用关系OK,那么这呢,想必大家也会有这样一个问题啊,会问说为什么咱们不在这个赋值的时候呢,就直接根据这个语句看一下,哎哟,你这呢是一个老年代代中的一个属性引用,你用了我这个新生代中的一个对象了,直接呢,我们根据这个语句呢,咱们去就就去更新这个ret,这样不行吗?当然可以了,但是这时候你要注意我们这阿塞的这个更新啊,需要同步。因为咱们是不是经常要去操作你对应的这个阿塞的对应的那个region是吧?啊这个所以呢,我们需要同步,那这时候呢,就会导致呢,你要是更新这个阿塞的时候呢,同步的话呢,我们说开销就比较大了,你可能会这个多个线程都得等待啊,所以这时候呢,我们先把这个数据呢,记录到我们这个dirty卡Q当中,然后呢,再从这里边去。
09:09
使用啊更新一下,我们这个阿塞,就在你用这个阿塞的时候,所以这个时候呢,性能会更好一些。啊,能理解这个过程行这个事儿呢,我想应该是说清楚了啊,那当我们把这个使用这个duty card q去更新完我们的R以后呢,这个r set呢,它就能够真实的反映老年代这个它的对我们这个新生代这个内存分段中这个对象的一个引用了。OK,然后接下来呢,我们要处理这个R塞,就识别呢,被老年代对象指向的这个异恋元驱中的对象,这些被指向的这个对象呢,它就是存活的啊,因为还被占用了嘛,OK,然后下边呢,叫复制对象,哎,其实这块就是我们所谓的一个回收的过程,这个过程呢,跟我们以前讲那个堆空间那个过程是一样子的,是吧?这个新生代呢,就是把它复制到这个survivor区,Survivor区呢,这个from区到two区,没有到阈值的呢,就加一到另外的那个区,然后到阈值的话呢,你就到O的区啊,这个urvivor区空间不够一区,这个数据呢,直接进升到了年代,这个都是咱们前面讲过的啊,不多说,注意这块我们用的呢叫复制算法啊。
10:09
是复制这个对象的意思。啊,复制这个对象的意思啊,行,那么接下来的话呢,叫处理引用,就是我们前面这块提到呢,还是一些强引用,然后后边的话呢,我们会处理这个叫软引用,弱引用,需引用,中间去引用,包括呢,GI里边这个弱引用啊这个咱们前面讲引用的时候呢,都提到过,对吧?哎,在垃圾回收的时候,既然GC了我们这个这个一定园区空间不够了,不够的时候呢,像这个,哎软饮用我们说也会回收是吧?哎,强软弱需啊软饮用还记得吧,我们说内存不足的时候回收是吧?这个weak的话呢,是不是?呃,这个只要呢垃圾回收就会把它回收掉。对吧,那应该还有印象啊行,那么最终的话呢,就使得我们这个一零区这个数据就空了,这个这些呢,就停止工作了,然后目标内存中的数据的它都是连续存储的,没有碎片啊OK,就是相当于我们复制到的这三个圈的这个区域的这个诶数据呢,他们都是没有碎片的。
11:02
哎,没有碎片的这个意思OK。那么把我们原有的异恋区的这个数据呢,清空以后呢,它就变成了一个空闲的,是不是一个空的一个region了,那这个region呢,再放到我们相应的这个,诶叫列表当中啊这呢本质上呢,其实是一个叫link的,诶叫做link的list,诶这个link list里边就专门记录了我们哪些region呢,是空的,然后这个region呢,下一下一个时刻的话呢,就是如果内存在需要分配对象的时候呢,可能会把它取出来,然后呢去接着存放数据,对吧?哎,这呢,就我们说的叫年轻代的这个GC啊,然后接下来的话呢,我们看这个第二个环节叫做并发标记过程。啊,下边这个环节呢,我们称为呢叫并发标记过程,并发标记过程的话呢,这块一共是有六个过程啊,这个呃又又比较多啊,大家呢得坚持一下啊,首先的话呢,我们叫初始标记,哎初始标记,这个初始标记呢,跟咱们前面讲的那个CMS啊,基本上是一致的啊初始标记呢,它是一个SW的,那怎么能够保证这个时间比较短呀,咱们只是来标识根基点能够直接可达的对象。
12:09
啊,就是你直接呢,跟这个节点量关联的这个对象呢,我们先标记一下,这个呢是ITW的,但是这个时间呢非常短嘛,咱们这个CMS呢,第一个环节也是他说过对吧,然后下个呢,我们叫做跟区域的一个扫描啊,Root region的scanning啊,这个GJC呢,扫描我们survivor区当中可以直接可达的老年代区域的对象。啊,并且标记啊,被引用的这个对象。啊,标记我们这个变应用对象,这是通过我们这个survivor区呢,去这个进行的一个扫描啊,然后这个过程呢,提到说必须呢,是在这个样JC之前来完成,在样JC之前完成。为什么呢?哎,能想清楚吗?哎,样JC,因为我们这个样JC,大家想它一旦发生样JC的话,比如说我们还回忆刚才那个案例,是不是每隔45秒就有一个样JC,对吧,那这个样JC的时候呢,咱们是不是要动这个survivor区啊。
13:02
啊,你要动这个service区,你既然要动这个service区三,所以说呢,咱们得赶紧呢,是不是先要用这个区扫描它,然后呢,可达的这个老年代的这个区域对象,因为老年代这个区域对象我们该保留,是不是还考虑得保留一下是吧?诶所以这块呢,我们得赶紧扫描,要不之后的话呢,你说这个能不能同时执行,让这些要动这个S,这就数据就乱了是吧?哎,这个注意一下啊。然后下边呢,提到叫做并发标记啊concurrent marketing,所谓的并发这块呢,就涉及到我们是这个应用程序呢,还可以执行,然后这个这个空间呢,我们这时候呢,还做这个并发的一个操作,这个操作呢,整个这个环节呢,可能会被这个样JC呢去打断啊是有可能的啊,被他打断在这个并发标记的时候呢,如果发现说区域对象中的所有对象,这呢是一个特别的啊,就是我们并发标就发现你整个这个region里边哇,所有对象全是垃圾。全是垃圾的时候呢,注意咱就别等了,既然你全是垃圾,这个时候呢,这个区域呢,就直接呢就被回收了。啊,这个我们也可以起个名字呢,叫做实时回收。
14:02
啊,就是当你发现呢,这个区域中的数据全都是垃圾的时候呢,直接就回收掉了,哎不用在下边再等啊,混合回收那个过程了啊说同时啊,并发标记的过程当中,哎,会计算每个区域的一个叫对象活性,什么叫活性啊,就你这里边垃圾到底占多少啊或呃这个这应该说是反过来啊,咱这个存货对象呢,占多少啊,所以叫活性嘛。啊,这个有什么用啊,呃,这个呢,咱们记得对于老年代的这个垃圾回收,咱们前面已经说过了啊,老年代垃圾回收呢,咱们这个G1呢,跟其他垃圾回收器不一样,他不会呢,把老年代呢,所有的这个对象呢,都便利完一遍呢,然后把垃圾都回收掉,它只是呢,是不是回收那些这个价值比较高的那些region,对吧?根据你的这个暂停时间,我们去决定回收多少个,但是它有个排序啊,也就是说呢,只会回收一部分老年代的这个region。哎,所以我们需要呢,计算一下这个活性,看看值不值得呢,我们去回收你这些瑞珍啊。或者值得回收哪些瑞针对吧,然后下边呢,叫再次标记啊,这个呢没啥可说的,咱们前面也讲过啊,就是因为你上边一个环节呢,是并发执行的,所以呢,我们需要对上一个环节呢,进行一些标记的一些修正,对吧?来标记的修正,就是你原来这块呢,标记当中说这个呃,怀疑它是一个垃圾的,这时候我们需要呢,再标记一下,看看它确定了是不是垃圾。
15:21
啊,确定是不是垃圾啊。行,那么是这就这个环节呢,是ITW的,因为你上边这个呢,呃,是并发执行的嘛,所以这个呢是一定是独占式的。啊,一定是这个独展式的。嗯,这里边又提到我们说这个g first,它使用的是这个CMS,比这个CMS更快的叫初始快照的一个算法。啊,Satb啊,这样的一个算法,这个大家关注一下啊,这个算法呢,比我们这个CMS呢,里边使用的这个算法呢,要靠谱的多啊,就速度更快啊,这个稍微关注一下,然后下边呢,叫做独占清理,这个时候呢,我们就会计算一下说各个区域里边这个存活的对象和这个GC的一个回收的比例啊,进行一个排序,说呢,我们适合看看先回收哪些啊region对吧?啊进行一个识别,为我们下一个混合回收呢做一个铺垫,这个呢也是一个STW的。
16:09
啊还TW的后边呢,就是清理我们这个空闲的一个区域啊行这呢叫并发标记的一个过程,主要针对的就是我们这个老年代是吧,还针对这个老年代啊行这个环节呢,我们就过了,然后第三个环节呢,我们称为呢叫混合回收。哎,混合回收。所谓的混合回收呢,我们称为它叫mixed jc啊,诶它不光是一个OLDJC了,因为它还会涉及到我们整个人,叫做young region,就是我们新生代也会进行一个回收,看这块呢,大家能不能看明白这儿呢?你看我这个图示,这是伊零区,伊零园区,它呢,就这个央JC到这个survivor去了。啊,这个也一样的道理啊,这个urvival区到这是吧,这个都有可能,这个你可以理解成叫from区,这是图区,OK,然后呢,这个survival区呢,有些数据呢,预值达到15了,我们就会到这个old区,然后old区呢,本身呢,他们也做一个清理,诶这个其中存活的对象呢,我们就都到这儿了。
17:02
看就是这样一个场景,整个这个过程的话呢,都是复制算法,那相对应的我们这个呢,是不是就没有内存的碎片对吧。啊,没有内存的碎片啊行,我们看一下这里边儿描述说,当越来越多的这个对象呢,进入到老年代的时候呢,我们为了避免呢堆内存呢被耗尽,就会触发一个叫混合的垃圾回收。啊,同时呢,还会回收这个啊,样样的一个region啊,新生带,需要注意的就是我们这时候回收的只是一部分老年带,而不是全部的老年带,这个咱们前面已经说到过了,通过这个呢,也想表达的就是我们这个g first呢,是不是叫低延迟是吧?哎,这个注意啊。呃,就是我们,呃,准确的说应该是能够限定在指定的这个暂停时间之内啊,主要是因为这个我们没有全部的去回收你这个相应的老年袋啊。嗯,可以选择哪些呢?这个old region呢,需要被回收,哎,我们可以进行一个这个耗时的一个控制啊,哎,就是我们前面因为标记的时候呢,是不是已经做了相应的一个排序了呀。
18:00
OK是吧?然后下边呢,就是我们说这个混合回收的这个细节了啊,这个细节呢,大家看好像也蛮多的哈,哎,这个坚持一下啊,咱们把这个混合回收这个过程呢,再稍微的提一提,说并发标记以后啊,老年袋中,哎100%这个垃圾呢,要被回收的呢,这个就已经被回收掉了,咱们前面已经说过了是吧,部分是垃圾的这个内存呢,就被计算出来了。啊,就是你哪些呢是垃圾,就是相当于我们这是一个region,大家注意啊,这是个region,这里边呢,是不是,诶这个段,这个段它里边就有很多分段了。这些分段当中,我们说有些是垃圾,有些呢是存货对象是吧?这呢我们就称为呢叫内存分段啊,诶部分呢为垃圾的叫内存分段呢,就被计算出来了,比如说你这是垃圾,这个垃圾这个垃圾,诶这呢我们就给他们做了一个相当于就能够标识出来,诶这些呢是要被回收的了,那默认情况下呢,这些老年的内存分袋呢,会分八次诶进行回收。哎,这个内存分段会分八次,这呢就涉及到一个参数,哎,这个大家了解一下啊。
19:02
好,那么混合回收的这个回收集啊,回收集说包括1/8的老年代的内存分段,还有这个伊甸园区survival区啊,因为呢是混合回收嘛,包括新生贷啊,那么回收算法呢,跟我们前面讲的这个年轻贷呢是一样子的,这呢就不多说了,这就过了啊,然后默认的话呢,我们说老年代呢,这个内存分带可以分八次进行回收啊,那优先呢,就回收垃圾比较多的对象了。啊,这个垃圾占有内存分段比例越高的越先被回收,这就我们说呢,你这个呢,回收的价值呢,是不是就越高啊。对吧,诶你说我们这样有一个region,这个region呢是个老年代,你回收完以后呢,发现里边这个对象根本就没有变过,完全的复制这一份,哇,天呐,这个效率是不是实在是太差了,诶像这样的我们根本就不用动它是吧?哎,我们先来回收那些,你这里边如果全是垃圾,那在前一个环节已经被回收掉了,你这里边呢,有一部分是垃圾,比例呢,越高我们就越先呢回收你,哎,所以这个呢,一定要多去关注啊。
20:00
好,这个默认情况下呢,这块你看提到一个阈值啊,就是有一个阈值呢,会决定内存分段呢是否被回收啊,叫65%,意思呢,就是垃圾这个占内存分段的比例达到65%的时候,我们才会去回收啊,回收的这个垃圾占比太低的话呢,我们就没有必要去回收了啊,有点浪费时间啊,浪费精力啊。嗯,那下边呢,就是说混合回收呢,也不一定非得要进行这个八次,这呢又提到一个阈值啊,有个这个数,这个默认的是10%,就意思呢,允许整个堆呢,诶内存当中有10%的这个空间啊,是浪费的,意味着如果发现这个可以回收的这个垃圾占堆内的比例呢,低于10%,哎,我们就不再进行这个混合回收了。啊,就是这都是一些优化上的一些点是吧,诶这个呢,大家去关注一下就行行,那这块的话呢,咱们就把前面这三个算是必须的这个环节呢,就算是说清楚了。哎,必须呢,这块我们提到了有这样的123这三个环节,对吧,那么我们说还有可能会触发一个是不是叫for这些呀。
21:04
哎,这个for jc,那for jc是什么情况呢?看一下。说我们这个j for,它这个初衷啊,就是要避免出现了一个for,因为呢,它是一个单线程的,是一个stop the word性能呢还比较差,对吧,这个大家都清楚了啊,那怎么去避免这个forc呢?啊,那你得先清楚呢,我们什么原因可能会导致这个forc是吧?啊这个你看我们回收的时候呢,没有足够的这个to这个空间,就是相当于我们这个内存空间是不足造成的,这是一个,另外呢,就是当我们并发处理的时候呢,还没有处理完这个空间呢,已经被耗尽了。啊,还没有处理完,已经被耗尽了,咱们前面呢,是不是也讲过这个CMS是吧,CMS的话呢,当时不是也有一个阈值嘛,诶你达到这个阈值的时候呢,我们就要进行这个呃,GC了,否则的话呢,这个我们说你是一个并发执行的这个用户限制呢,它这个如果说制造垃圾的过程比你回收的垃圾还快,那这我们真的就有可能,呃,要溢出是吧,当然溢出之前呢,我们是不是要进行一个for这CR,哎,把你这块所有的用户线程啊都停掉,然后我们要非for这些了啊这呢是ST。
22:09
哎,咱们尽量呢,要避免这个SDW是吧,哎,避免这个forc。啊这呢也类似啊就这个道理,那举例子的话呢,就比如说我们说这个堆应内存啊,太小了啊对应内存太小了,所以这个J呢,在复制这个存货对象的时候呢,发现诶这个复制的时候呢,你空间不够是吧?诶空间不够的时候呢,我们就会报这个for c。啊,有点像你这个一个屋子,这个屋子有点小,现在想整理这个空间啊,你得是不是得先有一片这个空闲的空间,该移的就移过来,然后呢,这块移完以后呢,剩下这个不要的就全都扔了,这样结果呢,你这块要移的时候呢,这个可用的空间太小了,这个时候呢,就会以for c。哎,这样。理解吧。哎,这就这个for是吧,那咱们前面呢,是不是还提到过一个for一个场景,就是咱们呢,是不是设置那个叫暂停时间呀。
23:01
回忆一下,咱们设置这个叫暂停时间设置这个暂停时间如果比较短的话呢,比如说是20毫秒,那导致呢,就是我们每次这个GC的时候呢,可以回收的这个region呢,是不是就比较少啊,你释放的空间就比较少,那么对应的话呢,我们这个用户线程不断的去执行那一方面呢,我们这个暂停时间设置短了,我们回收起来频率呢就会偏高一些啊,频率就会偏高一些,但是呢,也不排除我们这个呢,就是呃你在呃回收的再频繁,因为它这块还涉及到一个并发的一个过程,我们用户限制呢,还是可能会执行的,那么在这个执行过程当中,慢慢慢慢慢发现这个空间呢,每次回收的太少,但是呢,制造的垃圾又过多,那么在内存溢出之前,我们来了一次for GC。对吧?诶这些原因都会导致我们这个for g c这个出现,那咱们呢,在真正调约的过程当中,大家一定要避免这个for g c的一个出现啊,或者要避免它频繁的出现啊,这个大家要注意一下这个问题,行,那么这样的话呢,咱们就把整个呢,这个回收的这四个环节呢,就给大家呢做了一个介绍,那大家呢,整体上做一个了解就行啊,你看我这块呢,整个就讲到一起了啊呃,大家就没有必要呢,非常细致的说,每一个我都去背一背,记一记,这没必要,整个这个环节呢,大家清楚了解啊就可以。
我来说两句