00:00
那接下来的话,咱们看一下这个这first垃圾回收器呢,具体在回收垃圾过程当中的一些细节问题啊,这块呢,大家也会看到,就比我们前面讲的具体的某一个垃圾回收器呢,还要复杂一些,诶主要原因呢,是因为咱们前面讲的这个垃圾回收器啊,他们要么呢是针对于这个叫新生代,要么呢是针对于老年代呢进行垃圾回收的,那新生代的话呢,我们提到了就是比较频繁一些,对吧?诶频繁的去收集这个新生代里边呢,涉及到叫这个伊甸园区,Survival林区,URVIVAL1区,具体这个细节呢,不同的垃圾回收器呢,会不太一样,主要呢,就分成这个叫串行和并行的这样的一个区别,那么针对于老年代这块的话呢,我们说呃,这个频率比较低,那这块我们提到叫CMS这个垃圾回收器,还有Siri o,还有parallly o这样的三款呢,主要的老年代垃圾回收器细节呢也有些不一样,那相对来说呢,这个CMS呢,算是比较复杂的,我们讲了它有具体的四个环节,对吧,这个初始标记啊,并发标记啊,这个清理啊等等啊,并发清理啊,重新标记啊等等这样的一个环节,OK,那么。
01:00
我们现在呢,来讲一下这个叫g first垃圾回收器,这个g first垃圾回收器呢,首先明确呢,它不光针对于说新生代或者老年代了,这两个区域呢,它都可以回收,这呢是基于我们说叫region,也就是说呢,叫分区算法对吧,那这呢,我们会看到这个内存空间呢,就是这样的一个一个的小方块儿,每个呢都是一个region啊,它用于存储呢,不同的这个结构,所以这块我们在回收的时候呢,结构就会显得呢,稍微的复杂一些,那我们来看一下具体这个环节。那么针对于这个j first垃圾回收的话呢,我们说主要包含的,主要包含的啊叫三个环节,也就是说必须要包含的是三个环节,那还有可能会出现第四个环节,所以这块呢,我列出来了,但是加了一个小括号,加了一个小括号那一定会出现的话呢,首先提到了叫做年轻代的JC,也就是我们所谓的叫young j c,或者叫做mini j c都可以,然后在进行这个老年代回收的时候呢,我们首先需要进行老年代的一个叫并发标记的一个过程。老年代一个并发标记的过程,那就是concurrent一个marketing并发标记,然后这个并发标记结束完以后呢,我们要进行一个混合回收,叫做mixed g c,这个mixed GC怎么叫混合呢?因为它涉及到了年轻和老年共同的一个回收过程。
02:09
那就是我们指的这个环节,OK,那么这块呢,你看我还列出来一个点,说如果需要的话呢,这个单线程的独占式的高强度的一个forc还有可能会存在。你看它呢,也相当于咱们前边类似于是不是讲这个CMS的时候呢,我们说当你这个CMS呢,出现这叫failure失败机制的时候呢,我们也会使用叫c zero old,是不是作为一个后备的一个方案,对吧?那这呢也类似也类似就是我们这个G1垃圾回收器或者叫j first,它在回收的时候呢,是有可能会触发我们的for GC的,大家还记不记得我们前面呢,提到一个叫设置一个最小的暂停时间这样的一个概念,对吧?如果我们设置的这个暂停时间过小的话,咱们默认的是不是200毫秒啊,还记得吧,那如果呢,比如你设置成20毫秒的时候,那你想想我们每次呢,在垃圾回收的时候呢,是不是这个让垃圾回收器这个可以发挥余地的这个时间实在太短了,对吧,所以每次呢,回收的这个region呢就比较少,那么如果此时呢,你创建或者叫这个用户线程呢,这个新占用的这个空间呢,远大于我们这个region回收的这个速度的话呢,是不是就会触发我们这个叫forc了。
03:16
那因为你这个内存的迟到是不是会用完,那就触发这个for GC,那for GC的话呢,它是一个独占式的强度比较高的啊,单线程的这样一个特点,OK,但是正常情况的情况下的话呢,我们说都不会这个出现for GC了,那那你这块呢,如果一旦出现以后呢,你需要呢,进行一个性能的一个调优,那避免呢,让它出现这个for GC,那就有需要呢,具体来看一看这个代码那就行,那这呢我是用一个图示的方式呢,给大家表示表达出来了,首先的话呢,是年轻代的JC,然后进入呢,有年轻贷和这个并发标记环节,这个呢是虽然我们叫做老年代的并发标记环节,但是呢,这个环节当中是也会出现年轻带GC的啊,这个大家注意,然后呢,就是一个混合回收的过程,那这块呢,是三个环节,也有可能会出现四个环节,就是这样多一个这样的一个套路是吧。
04:03
好,这个图呢应该是比较清楚的,然后接下来我们对刚才说的这个环节的话呢,几个过程咱们整体上呢进行一个说明,首先的话呢,我们说这个叫样JC是吧,这个样JC的话呢,就跟咱们前面介绍过的情况是一样子的,当我们这个年轻代的伊甸园区这个要用尽的时候,就是当你要分配新的对象,发现空间不足的时候呢,我们要进行这个young jc了啊,进行这个央JC,在这个年轻代这个回收的时候呢,注意它是一个叫并行的独占式的回收器。收机器并行理解是吧,多个垃圾回收线程,独占式stop the word这样一个场景,那它会暂停所有的这个应用进程啊,应用的线程。行,那么这呢,跟咱们前面讲的这个内容就一样了,这个垃圾回收的时候呢,我们会这个清空这个伊甸园区,对吧,把这个伊甸区的这个对象呢,是不是就存放到这个叫survivor去啊,就是存活的存放到survivor去,那是垃圾的话呢,这块就清理掉了,对吧。
05:00
那么本身呢,是在survivor区呢,如果它达到那个阈值,默认的话呢,我们说是15,就那个A值呗,默认达到15的话呢,它就会存放到老年代,当然也有可能我们这个伊甸园区存放的是这个大对象,Survivor区呢,也存不下,是不是直接呢也会放到这个老年代啊。对吧,还有这样的一个情况啊,放到他这儿或者放到这儿,当然也有可能两个区域都会涉及到这个,跟咱们前面讲那个堆空间的那个内容啊,是一脉相承的,所以这块呢,大家并不陌生。OK,然后当我们这个堆空间的,这是我们说的这个叫样JC是吧,第一个环节啊。当我们这个堆空间的这个内存使用达到一定值的时候,堆内存的使用达到一定值的时候,咱们那会儿呢,是不是看那个参数的时候呢,提到过这个问题,默认的情况呢,是不是45%啊。对吧,说一旦呢,当你达到这个阈值45%的时候呢,我们就开始老年代的一个叫并发标记过程。诶,老年代的一个并发标记过程,那这个标记过程的细节呢,咱们一会儿看啊,当这个标记完成以后,咱们就开始叫混合的一个回收过程,就是我们说的这个第三个环节叫混合回收,对吧?这个混合回收这个过程当中呢,我们说这个呃,G first垃圾回收器从老年袋呢,会移动存活的对象呢,放到这个空闲的区域,就相当于我们进行老年袋的回收了,你要还存活呢,我们就放到这个空闲区域,这呢相当于也是一个整理嘛,那这些空闲区域呢,就成为了新的这个老年袋的一部分了,和年形袋不一样呢,老年代这个GC,嗯,跟其他这个垃圾回收器呢,还不太一样,这个老年代这个回收咱们以前讲呢,因为你是整块的一个老年代,所以我们是整体上进行的,是不是叫major这些啊,对,而我们现在的话呢,它主打的叫低延迟嘛,那低延迟的话呢,因为我们分成了很多region,咱们前面已经说了好几次了,是不是只选择满足你那个暂停时间的情况下呢,我们去挑选那些价值比较高的region进行回收,对吧,所以它只会扫描和回收其中一部分啊这个region。
06:52
啊,一部分这个瑞振,那在这个过程当中,我们说老年代的瑞振和年一代的这个是可以一起被回收掉的,这呢叫混合回收嘛,混合回收呢,还涉及到这个新生代的一个回收啊行,下边呢举了个例子,就这呢,就是我们所说的一个正常的一个场景,正常的一个场景,比如说这有一个外部服务器,这个外服务器的话呢,我们说最大的这个这个进程的这个内存呢,是四个G,每分钟要响应有1500个请求。
07:16
每45秒钟呢,我们就会重新分配大概2G的这个内存,呃,你看每45秒钟,因为我们进行过一次样GC样GC的话,我们会回收很多的这个数据是吧,很多的这个空间,然后空出来了,有两个G的,两个GB的这个内存空间可以去使用。OK,然后每31个小时的话呢,我们整个堆呢,这个使用率呢,会达到45%,每31个小时达到百分之三十五四十五,然后我们开始呢,进行老年代的一个标记,标记完以后呢,我们进行一个混合的一个回收。啊,混合的回收啊,这呢就属于一个正常的情况,如果呢,你触发了这个forc,而且还是比较频繁的触发这个forc,大家这时候呢,就需要呢,去做我们这个相应参数的一些设置啊,你看内存空间设置的是不是合理。对吧,诶这样的一个场景,OK,这呢,就是我们整体上呢,对这样的几个环节呢,进行一个介绍,当然呢,首先呢,就是先心里有数,然后的话呢,我们具体展开看一下这个第一个环节,第二环节和第三个环节,他这里边的一些细节的问题啊。
我来说两句