00:00
下边啊,咱们来讲一讲,说叫评估垃圾回收器的一个性能指标啊,说到这儿的话呢,大家肯定会想到这个,以前我们提到这个算法对吧,那一提到算法的话呢,我们说如何去衡量诶,同一个完成同一个功能,我们写了不同的这个代码啊,就是用不同的算法实现呢,说哪个算好,哪个算不好呢,我们关于算法呢,是不是也有相关的一些指标啊,对吧?比如说这个时间复杂度,空间复杂度对吧?像这个排序算法,我们还关注关注这个叫稳定性,那这呢,就是我们衡量一个算法它的优劣的一个指标,那么对于我们提到了各种各样的垃圾回收器来讲,怎么算好,怎么算不好呢?这块我们也会有相应的一些指标啊,就是咱们下边列的这些。啊,这是一方面,那另外一方面呢,就是说,诶,咱们通过这些指标啊,咱也能够看出来,对于咱们未来发展的这个垃圾回收器,它追求的点重点是在哪儿,诶这个呢,咱们都会给大家说到啊。好,那我们来看一下下边我列的这几个指标看,一共是有六个指标对吧,那如果呢,大家去看一些书啊,包括网上一些帖子当中啊,你你会发现呢,有些这个性能指标跟我列的这块呢,会稍微有一些区别啊,没有关系,因为我们重点关注的呢,只是其中看我标红色的,标红色的话呢,其实实际上是都是一样的哈,哎,都是一样的,那么除了标红之外的剩下呢,可能会有一些区别,没有关系啊,这不是我们特别关注的点,行,那我们一个一个来看一看,首先第一个呢,我们称为呢,叫做吞吐料。
01:24
啊,叫做吞吐量,就是用户代码这个执行的时间呢,占总运营时间的一个比例,那总运营时间呢,就是涉及到我们用户代码的时间和垃圾回收花花的一个时间,对吧?啊,那我们举个例子啊,比如说我们这个用户程序,就是用户线程执行的时间呢是A,这个垃圾回收的线程是B,那么这个吞吐量呢,就是相当于是用A除以A加B。啊,那你也能看到这个吞吐量的值,它实际上是零到一之间的一个数,对吧,一个小数啊好,那么下边这个概念叫做垃圾收集的一个开销,它正好呢,是我们这个吞吐量的一个补数。那什么意思啊,就是垃圾收集的一个开销呢,它是还用我们这几个数来表示呢,它叫B除以A加B。
02:07
B除以A加B,那这个吞吐量和我们这个垃圾收集的开销,它俩加一起正好是不是就一呀,哎,正好就一,那我们要追求的话呢,肯定希望这个吞吐量是不是越大越好,就是你用户程序执行时间越长越好,垃圾回收呢时间越短越好,对吧?这个越接近于是不是就越好啊,那这个呢,越越接近于零就越好是吧?OK,下一个呢,叫做暂停时间。暂停时间呢,就是说执行垃圾收集的时候,程序的这个工作线程啊,也就是说用户线程被暂停的一个时间。那这呢,实际上就是我们前面提到这个叫STW对吧。Stop the world这个时间,那咱们呢,是不是希望这个暂停时间呢,越小越好啊。对吧,哎,你暂停时间呢,越小越好,OK,因为在暂停时间这个,呃,这个时间段之内呢,咱们这个工作线程或者叫用户线程是不执行操作的啊好,下一个呢,称为叫收集频率说呢,相较于应用程序的这个执行啊,咱们垃圾收集的这个行为呢,它发生了一个频率。
03:04
哎,发生一个频率OK,那问大家一个问题啊,你说我们这里边频率呢,是高一点好还是低一点好呢。高一点好还是低一点好?按说呢,感觉说应该低点好是吧,你少垃圾回收嘛是吧,当然这个哎回收的频率低了,可不意味着咱们一次回收的时候呢,用的时间短。我再说一遍啊,就是你回收的频率低了,可不意味着咱们一次回收的这个用的时间短,那举一个生活中的例子啊,之前呢,说过大学的时候呢,包括上高中的时候,我上初中开始,其实就开始这个去就就就住校了啊,然后上高中的时候呢,就是自己在边租了个小房子啊,因为在学校宿舍里边的话呢,这个晚上熄灯时间比较早嘛,诶,所以就出去租个房子是吧?呃,那衣服的话呢,都得自己洗哈,那你想想这个,呃,你说我们洗衣服的频率比较低啊,洗衣服的频率比较低,那你想想你通常是不是一次洗的时候呢,花的时间要多一点啊。
04:01
啊,我们上大学的时候呢,有的那个宿舍的男生就就就特别爱干这个不能说他爱干净啊,只能说人家那个习惯哈,就是天天洗衣服,天天去去这个水房里边,就看着他在那洗衣服,因为我们这个宿舍正好对面就是水房,天天见着在那儿洗,然后一边洗一边唱歌啊,就崩溃了都啊那有的人呢,他就习惯什么,比如我一个礼拜洗一次,那通常我们说这个洗衣服的频率,你看你频率越高的话是吧。呃,越高的话呢,你可能一次花的时间就越短嘛,啊,你要说洗衣服频率很低啊,111周或者一个月洗一次,那你可能一次呢,就需要花一天时间。啊,所以说这个频率的话呢,诶频率低了,可不意味着咱们每次呢,你这个执行垃圾回收的这个暂停时间要短。反而的话呢,就是频率低了,暂停时间是较长,频率高了呢。啊,频率高的话呢,诶这个暂停时间就要短一点啊,频率低的话呢,这个A吞吐量就好一点。有点绕是吧,哎一会儿呢,关于这个吞吐量和暂停时间,咱们重点要说的哈,行,然后下一个概念呢,叫做内存的一个占用,就是我们Java堆区啊,所占用的一个内存的大小。
05:07
啊,就是你给我分配的这个空间到底有多大是吧?诶它也是衡量我们这个指标啊,当然这个空间是不是大一点要好一些是吧,省着你这个老师垃圾回收了啊下边这个叫快速啊,就是一个对象呢,从诞生到的被回收所经历的一个时间,那我们当然也希望说一旦你这个对象不用的时候呢,是不是尽快的给回收掉啊,省着在这个空间里边占用,呃,影响我们这个,呃,这个再分配对象是吧?诶也甚至呢,会影响我们这OM,包括内存溢出啊,内存泄露那就更是了啊行,那么这呢是我们说的这几个指标,这几个指标当中,哎,我标红色的这三个呢,是咱们重点要关注的,剩下这几个呢,大家了解一下就行。啊,那关于我们标红的这三个说,他们共同构成了一个叫不可能三角。那不可能,三角你选这个吧,那个就会受影响是吧,这个好的那个就差,就跟咱们说通常呢,你这个时间复杂度啊,这个时间呢,花的特别少的时候呢,一般空间呢,我们用的是不是要稍微多一些啊,就是一个此消彼长的一个特点。
06:02
那如果说你能达到一个完美的话呢,那就用不着那么多垃圾收集器了,你想想是这意思吧。啊行,嗯,你你就就好比是这啊,你说到这,你看咱们这个写的这个垃圾收集器,你看这个呢叫呃吞吐量优先啊,下边这块呢,是不是叫低延迟优先,低延迟的话呢,指的就是说咱们这个叫暂停时间呢要短一些,哎,所以说他们有各自的这个特点和倾向性啊,那么在实际这个开发当中,你就可以具体的看你这个场景来选择了啊。好,那么三者总体的表现呢,会随着技术的进步呢,咱们会越来越好,毕竟这个硬件的性能至少也会越来越高,对吧?作为一款优秀的手机器啊,最多同时满足其中的两项,就是我们不可能说让三者呢全都满足的。啊,不可能的是吧,行,然后呢,下边说在这个三项里边,这个暂停时间,它的这个重要性呢,日益凸显,你看我这块呢,把它也加了一个粗体是吧,诶它的这个重要性日益凸显,这也是咱们未来呢,所要追求的一个目标啊,就是GC不断迭代的时候呢,我们追求的一个目标呢,就是尽量的这个低延迟。
07:03
诶为什么这么讲呢?那大家想啊,现在随着这个硬件的提升,我们说这个内存啊,是不是就越来越便宜啊,那就意味着咱们这个可以分配的这个内存空间啊,实际上是越来越大了,对吧,那你想想这个内存空间越来越大。就好比是你买的衣服呢越来越多,那这个时候呢,你可以选择的穿的衣服呢,就越来越多,内存空间大了,咱们呢,是不是垃圾回收就不用那么频繁了,就是不停的在里边,呃,去去分配数据啊,分配内存去操作,相应的我们这个吞吐量呢,实际上就上来了。吞吐量挺好就上来了,对吧?诶甚至再举个例子,你买了个大房子嘛,房子越来越便宜,你买个超大的房子,里边呢,你可以活动的范围就越来越大啊,这个吞吐量呢,就意味着越来越大,但是的话呢,大家想,那我现在这个空间越大了啊,里边分配分配分配,然后到一定情况在下的话呢,咱们必然会进行JC,咱们现在还没有到说这个内存空间,你这个大到数我们都不用再去JC的情况下,是吧情况了,那不可能,哎,我们一定会JC,但是你这是要JC的话呢,你想想你面对的是一个大的内存,大的堆内存,那我们就意味着一次性的这个垃圾回收,它所花的这个时间呢,是不是就要更长一些啊。
08:09
也就是说呢,你这个内存空间大的话呢,反而导致我们这个暂停时间呢,是不是跟着也大了,哎这是不好的,所以就会影响咱们这个延迟。啊,内存空间越大,反而这个延迟的话呢,会带来一些负面的影响,因为花的呃暂停时间呢就越长了,不好啊行,那么总结一下的话呢,从这三项里边,我们再给它这个聚焦一下,我们重点呢关注的是其中的两项,一个呢叫做吞吐量,诶一个呢叫做暂停时间,诶就是我们根据这些这么多指标,我们在最后呢,给他这个浓缩充两个点,因为这两个点呢,诶表现出来的一定的矛盾性啊,我们关键呢,关注的就是吞吐量和暂停实件啊,也正因为这两点呢,我们看到有些垃圾收集器呢,更多的关注的叫吞吐量。啊,比如我们说那个parallel啊是吧,诶它关注的这叫高吞吐量,而我们这个呃,像CMS啊,像G1啊,包括像后边这个ZJC啊,我们更多关注的叫暂停时间,希望呢,它是一个低延迟的。
09:06
OK行,那接下来呢,我们分别啊,重点呢,针对于这个吞吐量呢和暂停时间呢,来做一个介绍。
我来说两句