00:00
刚才啊,咱们讲到说现在啊,几乎所有的这个Java虚拟机都是采用了堆空间分带的思想,对吧,我们分成了叫新生代和老年代啊,那既然呢,你采用了分带的思想呢,进而我们在回收这个堆空间的时候呢,咱们使用的就叫做分带收集算法,那具体呢,就是呃,复制算法啊,你看是在新能代当中去用,对吧?针对于老年代的话呢,我们可以是这个标记清除或者标记整理算法呢,给他们结合起来去使用,那就是这样的一个场景,这呢我们提到叫分带收集算法,那么这个说完以后呢,咱们下边呢,再给大家提两种算法,从这个名字上来讲的话呢,就是两个新的这个词了,叫增量收集算法和分区算法,那这两个算法又是解决什么具体的问题呢?哎,咱们来看一下。首先的话呢,我们提到叫增量收集算法啊,增量收集算法说呢,前面描述这个算法呢,在垃圾收集过程当中,咱们多少呢,都会让这个软件或者程序呢,处于一种叫stop the word的一个状态,就是我们说ITW能理解对吧,就是当我们进行这个比如说呃,标记这个标记清除或者标记整理的时候,我们先标记,在你标记的时候呢,你必须得让我们整个的用户线程上得停下来。
01:10
哎,或者你理解为就是一个挂机状态,然后呢,我们标记完以后进行清理,然后之后呢,你的这个应用用户的这个线程,应用程序的这个线程呢,才可以继续去执行。没问题对吧,那大家想一想,如果说呢,我们这个垃圾呢,回收的时间比较长,那这时候呢,你让这个用户线程挂起的时间呢,就会比较长,这时候呢,就会导致咱们用户的体验啊,就会比较差一些,就感觉这个程序呢出现卡顿的状态了,那以及呢,说这个系统的稳定性呢,也会受到这个影响啊,那我们现在要讲的叫增量收集算法和这个分区算法呢,主要呢,就是解决咱们这个stop the word这个时间,呃,说白了就是我们这个延迟时间比较长的一个问题。啊,就是主要来解决这个问题。啊,那它这个解决的一个基本思想是什么呢?我们看一下说呀,如果你要是一次性的把这个所有的垃圾呢,都进行处理的话,必然会造成系统长时间的一个停顿。
02:05
对吧,那这时候怎么办?说咱们可以让这个垃圾收集的线程和这个应用程序这个线程他俩交替的去执行。交替执行,诶大家想想这个呢,其实也很好理解,你想你生活当中,嗯,举个例子,比如说大家呢,你有一套别墅,这套别墅呢,你你这个你还有你的朋友或者你的家人是吧?啊就可劲造啊,从来也不收拾,隔了半年以后呢,你现在想把房子呢,好好收拾收拾,那你想这时候你的收拾就类似于垃圾收集,那你这时候呢,说所有的家庭成员,现在咱们都停下来啊,什么活也不能干啊,不能有这个用户现状再去执行了,大家都挂起,现在我们收拾垃圾,这一收拾呢,花了一周的时间。啊,这个时间是不是停顿的就比较长了,是吧,不太好是吧,那怎么办呀,那这个时候我们说呢,平时的时候呢,你可以每隔一周呢,你就收拾一次房间,那这时候你收的时间显然是比较短一些了,就我们交替一执行,就使得呢,用户的这个延迟呢,就显得不是那么明显了。
03:00
啊,那你一周收拾一次,我们每次呢就花半个小时,那显然呢,感觉体验要好一点,对吧?或者再举个例子,就比如说这个上学的时候啊,像我那时候上学的时候呢,就可麻烦一个事儿,可能男生是不是都有这个问题啊,就不喜欢洗衣服啊,赶洗衣服好麻烦呀,尤其是这个夏天的时候,这个你出去一趟,然后这衣服就全湿了,你就得洗是吧,有时候比较懒怎么办啊,一攒攒上一个礼拜,攒上俩礼拜。啊,这个经常不是还调侃一句话呢,先把这个衣服呢都穿了,都穿完一遍以后呢,发现没得穿了,然后再从这个脏衣服里边再挑出一件相对干净的再接着穿是吧?诶不知道很多人有没有过这样的这个经历啊呃,那你想想,你要是每隔半个月你洗一次衣服,那你洗一次的话呢,可能就得洗一天啊,在学校里边那时候洗衣机也不太方便啊,然后都得没啥洗衣机,住宿舍嘛,都得自己去手洗是吧?啊那你一洗洗衣天哇,感觉好麻烦呀,那那你怎么办呢?还有一种方式就是你每一天呢就洗一次,比如说你每一天这块,或者每隔两天你感觉这个衣服脏了,你就临时洗一下,可能这个洗上这个十几分钟,20分钟是吧,半个小时就洗完了啊,经常呢,实现这个你穿衣服跟这个洗衣服这个交替起来,就不会凸显出来,你每隔半个月洗一次,一次洗很长时间这样的一个,呃,什么延迟呢,就很差的一个场景了。
04:18
对吧,诶这个问题啊,说呢,每次的时候呢,咱们垃圾收集线程呢,它只是回收呢,一小片区域的这个空间,当那个回收完以后呢,它紧接着就切换到这个应用程序的线程。哎,然后呢,依次反复,那应用程序执行过以后,执行执行过一段时间以后呢,咱们再切换成这个垃圾收集的线程,让他俩呢,这个交替的频繁一点,那就使得呢,咱们这个,诶这个延迟性呢,是不是就没有那么夸张了,那用户体验呢,就会稍微的好一些啊就这样啊下边说总体上来讲呢,咱们说增量收据算法呢,基础仍然是标记清除和复制算法。啊,仍然是这个,只不过呢,这个增量收据上面,它的着重点呢,是在于处理这个线程间的一个冲突问题,也就是说呢,咱们这个应用程序的这个用户线程和我们这个垃圾收集的这个线程,怎么呢,让他俩协调的进行一个交替执行,对吧?诶以使得呢,咱们这个程序呢,能够以这种低延迟的方式呢去执行,那这呢,其实这种交替行为呢,在咱们后边呢,就会提到这就是一种并发行为。
05:17
啊,看似呢,就让他俩并发的去执行,达到一个低延迟的一个效果。OK,行,那么这种增量收集算法,它有没有什么缺点呢?嗯,这个大家呢,我觉得可以养成一种这叫方法论是吧,咱们说任何一个新东西,不管你是学习这个知识也也好,还是说呢,你这个生活中也好啊,比如说你见到一个女生啊,这个女生的形象特别好啊,气质也好,身材也好,哎,突然呢,就就就就看上你了。你这时候呢,就无比的兴奋是吧?这个时候呢,呃,是换成谁哪个男生呢,这个脑子都会被冲昏了,简直呢这个呃,上天对自己太好了是吧?啊,那事后呢,你也要想一想,有任何事物呢,你都要想想,诶他喜欢我,他主要是看中我什么呢是吧?诶,好处呢当然很多了,那你说有没有什么缺点呢?
06:03
那你得想一想,那你想清楚以后呢,那这时候你看要不要跟大家去处啊,有的人呢,我觉得这方面就做的就很好,能够想的很清楚,对吧?啊,这个不是说一个美女呢,呃,这个想撩你啊,你就都同意,你想想哎,这样一个女生是不是说脾气比较大呀,对吧?哎,是不是说这个习惯上被别人宠着,那你这块你的脾气也不是特别好,你又宠不了,那天天吵架,天天吵架也不行啊,对吧?哎,或者再说再换一个场景,就是这个这个女生你想想啊,你你你看着她形象各方面都很好啊,穿着也很得体,呃,那你是不是正常的花费上也要稍微的大一些呢?对吧?哎,这个可能你想想多了以后呢,就说,哎,那算了,整不了是吧?哎有的人呢,这方面就想的比较清楚一些啊,我觉得是这样啊,还包括呢,有的一打电话说,诶你中了500万是吧,你想诶诶一说挺好,还中500万,那有什么不好的方面呢?那可能他是个骗子嘛,对吧?诶就是大家呢,当每次你遇到这个外界的事情的时候呢,诶它可能是一些好事儿,也可能是一些坏事儿,那你都想想它的对立面是什么啊,那对于坏事的话呢,咱们以前也有一个话叫什么塞翁失马,焉知非福,对吧?诶这是坏事儿,把马丢了,但是呢,诶它难道不是一件好事儿吗?哎,就从另外一个对立面上去看一看。
07:16
啊,我觉得呢,这是一个非常好的一种方法论啊,然后大家呢,可以在生活当中不断的去训练,哎,我觉得你会有一些变化啊,会显得更成熟稳重一些是吧,至少呢,思考问题的时候呢,你会更加的理性,不会一下子重复了脑子,然后凭着一个直觉呢去做一些事情了,行,那我们提到这个增量收集算法呢,刚才说主要目的呢,是为了来处理这个用户线程和这个垃圾回收线程它的一个交替问题,然后使得呢,我们以一种低延迟的方式呢,去,呃并发的方式啊去执行啊,让用户呢感觉体验呢会好一点,当然这块缺点是什么呢?哎,那大家想一想,那我们缺点呢,就是你频繁的如果去交换这个用户线程,诶这个切换用户线程和我们这个垃圾回收的线程的话呢,因为你的切换是不是也需要耗费这个资源啊,那会导致咱们整个垃圾回收整体上来看这个成本呢,那其实就上升了,那造成呢,咱们这个吞吐量的一个下降。
08:09
诶后边呢,咱们讲垃圾回收器呢,咱们衡量它的指标呢,主要是两个,一个呢叫低延迟,一个呢叫做吞吐量,那它俩呢,也是有点这种矛盾啊,此消彼长这样的一个特点,有点像我们说这个正常一个算法,空间复杂度和时间复杂度一样,很难呢,我们说把他们,呃二者呢都考虑的特别完美啊,通常的时间复杂度高的,我们空间复杂度呢,呃就就低一些是吧,哎,它是此消彼长的一个过程。诶这个呢,大家要注意一下,那这个呢,其实就好比是咱们大家呢,这个如果你是个单核的CPU的话呢,你你这个D盘呢,要拷贝一个G的文件到E盘,那同时的话呢,这个F盘比如说再拷贝一个G的文件呢,到这个G盘,那我们想拷虑怎么拷贝能更快一点,那你要是把这个呢,拷贝打开,把这个打开,我就一个单核CPU,那在拷贝的时候呢,是不是还快速的去切换这样两个这个进程是吧,那这时候呢,肯定效率呢,反而不如你先拷贝完一个,再拷贝第二个呢,效率更高一些,这个事呢,常识是吧,大家我觉得都应该能明白,OK,这呢就咱们说的,这叫增量收集算法,它的优点和缺点。
我来说两句