00:00
好,那么在确定了咱们这个house bar虚拟机既使用这个解释器啊,又使用这个GI编译器之后啊,咱们来看一看这个GI编译器的细节是吧?啊咱们呢,刚才说的这个两个都采用了,就是采用就是看中他们各自的这个优势啊,就跟我们说一个公司的这个领导者一样,是吧,他这个下边的员工很多啊,每一个我们不指望着说这个公司的这个领导是吧,他是这个各方面能力最强的,那要是这样的话呢,咱就没有必要呢,是雇这么多员工了啊,那你这时候呢,一定要发现各个员工不同的优点啊,那么。用好各个员工的各自的优点就可以了,这呢,我们就看重于那个叫水桶理论的那个长板啊,从领导领导的角度来讲呢,更多的呢,是看到他们的这个长板优势啊,是这样子的,那么对于呃个人来讲的话呢,有的时候我们说一个人他到底能够走多远是吧?哎,这个有的时候呢,一定程度上也会看他这个短板。那就是从不同的角度呢,我们看的这个点呢,是不一样子的是吧,那houseport呢,就类似于我们说这个领导者一样,它也能看到我们的解释器和这个即时编译器他们各自的优点,然后让他们呢搭配起来来使用。
01:07
那么如果从一个呃另外一个场景上来给大家举例子的话呢,就有点像什么呀,就好比是呢,我们去一个高档的餐厅啊,去吃一一桌这个大菜是吧,你要请这个呃这个好朋友是吧,或者说非常这个贵重这个这个叫什么尊贵的这个客人啊,请人家吃一套吃一个吃一套这个满汉全席,当然可能有点夸张哈,你可以吃一套北京的特色的叫呃全聚德,那你去吃这个烤鸭的话呢,我们说烤鸭呢,本身是一个大餐,但是这个大餐的话呢,它需要一点时间呢去做啊就有点像呢,咱们讲的叫git编译器一样,你上来呢,就把这个代码呢,使用这个git进行编译的话呢,花的这个时间很长,这个时候呢,你让这个客人呢,在这等着呢,显得不太好,那通常呢,这个烤鸭上来之前呢,咱们是不是先上几个诶特色的小凉菜是吧,这个花的时间呢也不多,诶先把这个凉菜上来,诶你先吃着,然后呢,诶一会儿呢,咱们这个烤鸭就上来了,那么一开始你上这个小凉菜啊,就有点儿像咱们这个叫解释器啊上来呢,这很快呢,诶这个菜就上来啊显得呢这个做菜呢。
02:08
速度很快啊,然后呢,你再慢慢的去做这个烤鸭,哎,烤鸭一上来,那当然呢,烤鸭呢是重头戏是吧?诶就这样大家呢,呃,对比着去理解一下哈,那下边的话呢,咱们来看一下这个叫git编译器啊,首先的话呢,关于这个编译器啊,咱们先进行一个概念上的一个梳理啊,因为这块呢,说存在一定的不确定性是吧,那关于编译器的话呢,我们这样来区分编译器啊,咱们可以分成两个概念,其实在前面呢,咱们讲的时候呢,给大家也提到过了啊,一个呢我们称为呢叫前端编译器,一个呢称为叫后端编译器,所谓的前端编译器啊,就是咱们Java的这个源程序叫Java这个文件,把它呢翻译成这个自解码文件的一个过程,我们称为呢,叫做前端编译器,那典型的前端编译器呢,叫散公司,或者现在叫Oracle也可以是吧,已经被收购了啊,S公司呢,我们这个Java c,还有这个E类里边这个增量式的一个编译器。
03:01
啊,就ecl呢,我们编译的时候呢,实际上是用它自己的这个编译器,对吧?哎,生成这个自解码文件,这呢都成为呢叫前端编译器,很好理解,对应的话呢,就是咱们,呃,这个给大家呢说的这个图当中的再找一下。这里边这个橙色的部分对吧,那么这里边儿这个蓝色的部分呢,对应的就是咱们说的这个叫后端编译器。嗯,回过来。那对应呢,我们这叫后端编译器,那后段编译器呢,就是将我们这个4G码文件呢,把它翻译成这个机器指令的一个过程,当然中间呢,我们说还是要过汇编的,之前咱们也给他说了是吧,说过啊,任何高级语言呢,我们把它呃,放在具体的这个硬件系统下呢,去执行,它都得需要经过汇编的一个过程啊,咱们通过这个C和C加R的这样一个执行过程呢,给大家也讲解过是吧?诶大家能够透彻的去理解,那么除了这两个之外呢,你看我这还写了一个叫at,叫a ahead time啊compr就是提前,你看静态提前变译器,这呢也是咱们在Java呢后续发展的一个趋势,或者呢是它的一个方向,这个咱们在这张呢,最后呢,咱们给大家呢,稍微提一下,这叫AOT啊编译器的一个概念,行,那么在JT编译器这块呢,我们提到一个叫C1,一个呢叫C2,诶这两个呢,也可以成为一个呢叫client模式,一个呢叫server模式,它对于我们这个自解码文件。
04:20
翻译成这个机器指令的这个优化的深度啊,不太一样啊,这个咱们呢,一会儿再说OK行,那这块呢,咱们就先把这个概念呢捋捋清楚,然后呢,咱们来说一下程序呢,现在已经到这个自解码文件这块了,对吧,已经到这块了,说呢,我们嗯马上要执行啊,就是响应速度要够快,咱们用解释器说你要不是这么着急呢,咱们就用这个git,那现在呢,我们就想用git了,那就想用的时候呢,我们就要考虑,那这个代码呢,适不适合用git呢,还是说用这个解释器呢。是吧,你说用他们各自的优势,那现在这个事来了,到底谁来干呢?就跟说公司里边两个员工,这个员工有这样的优势,这个员工有这样优势,那现在这个事来了,到底是让谁做呢。
05:01
对吧,哎,那我们看一下,哎,什么时候呢,我们会让这个git呢,去做一个叫即时编译,OK,那我们这里边提到一个叫热点代码啊和探测的方式。诶这个呢,其实就是一些描述性的啊呃,大家呢,一块儿走一走,其实呢,呃,就大家这个职场来讲呢,都非常的简单啊,我们就把这个内容呢,给大家梳理清楚就可以,就是啊,我们需要到底要不要用这个git编译器,咱们呢需要判断呢,你要执行这个代码,呃根据它执行的一个频率呢来定。哎,这个执行频率比较高的代码啊,咱们就把它称为呢,叫做热点代码。啊,就成为热点代码,那么针对这个热点代码哈,咱们就可以使用叫git编译器进行一个即时编译,哎把这个即时编译呢,我们称为呢叫一个深度优化,哎把它呢,翻译成我们对应的这个叫机器指令。能理解是吧,提到这叫热点代码,那么呃,执行频率比较高的这些代码呢,我们称为叫热点代码,那多少算频率高呢是吧?哎,那关于这个细节呢,咱们再来看一下。
06:03
说一个被多次调用的方法,或者是一个方法体内呢,循环次数比较多的一个循环体,我们都称之为呢,叫热点代码。那J呢,把它们翻译成这个机器指令,那把这个过程啊,咱们称为呢叫站上替换。占上替换啊,叫osr啊,Sta replacement啊,这个咱们以前呢,是不是也讲过叫占上分配啊。是吧,就是我们讲这个对象呢,是不是都分配在这个堆中呢?诶我们当时讲了一个叫占上分配是吧?哎,这个呢,叫占上替换啊行就是呢,我们在这时候呢,因为咱们说执行的这个方法呢,呃,都是分配在这个战当中,一个一个的战争的方式来存在的嘛,是吧,我们站长提到一个叫战上提换啊到底这时候解释行还是说及时翻译,及时变译呢?诶这里边的一个问题,行,那么一个方法执行多少次,我们才诶需要呢,达到一所指定的这个标准呢?诶我们这依套依靠的呢,叫热点探测功能。啊,这都是一些名词行,那么对于hotport虚拟来讲,咱们采用的热点探测的方式啊,说叫基于计数器的热点探测。
07:06
哎,基于计数器以前呢,我们讲说这个呃,堆空间中的你这个对象说什么时候呢,给它放到个呃老年代呢,咱们当时提到一个叫A计数器是吧,就是年龄计数器啊,这呢是另外的一个计数器,这个计数器呢,是来判断说我们当前的这个方法,或者说你这个循环体这个代码呢,咱们要不要给它做一个计时编译啊,这呢也叫计数器,那这个计数器的话呢,这又分成了两种方式啊,一种呢叫做方法调用计数器。还挺复杂的是吧,一个呢叫做方法调用计数器,一个呢叫做回编计数器。哎,方法调用就是来统计咱们方法被调用次数的一个计数器,就是方法这个到底调用过多少次是吧,就这意思,那回编计数器呢,主要是来统计这个循环体执行的次数的。诶,所以不矛盾是吧,诶很清楚啊,像这个概念的话呢,大家呢,原来可能你没听说过,觉得好像很高大上似的,其实呢,这块概念一解释呢,也就这么回事儿是吧,好,那咱们呢,就下边一个一个来看一下,首先来看的这叫方法调用的计数器。
08:05
哎,方法调用计数器是吧,这个计数器呢,就是统计方法调用次数的它的呃,默认的阈值呢,在咱们兰模式下啊,一会儿呢,咱们说这个兰特和这个serve模式,在这个client模式下呢,是1500次,在serve模式下呢,是这个1万次。啊,这个so模式呢,其实咱们前面呢,Houseport虚拟机,咱们包括讲那个说对象呢,是不是都分配在这个堆当中,咱们讲过这个战场分配,讲过这个同步省略是吧?诶讲上过这个讲过这个叫标量替换,其实那些操作呢,也是基于咱们这个so模式啊,那时候为啥咱们没有刻意的说提,诶这个你兰模式下默认的没有开启呢,是因为咱们对于咱们现在的大家的这个,即使你是自己的这个PC啊,这个笔记本电脑,呃,咱们如果是64位操作系统的话呢,默认情况下呢,它用的就是一个server的模式。诶,所以没有刻意的去强调啊,哎,这呢也提到这个client模式和server模式,一会呢,我们再说一下这两个问题,那在client模式下呢,是1500次,那server模式呢是1万次,哎这个注意那超过这个阈值的话呢,就会触发这个叫git变异,那YIG呢,就是在我们这个server模式下呢,似乎呢,是不是就更难去触发一个叫git啊。
09:12
是吧,因为它这个次数比较多啊,但是一旦要触发以后呢,这个sor端它的执行的效率呢,肯定还是要比我们的C兰呢要要高一些的啊,毕竟呢,Server端的这个相对的配置来讲要强一些啊。行,那么具体这个次数呢,你呃,能不能去改呢?当然可以了,这个咱们是所谓的默认值,你要改的话呢,可以使用我们这个compel shold,就是编译的一个阈值进行设置就行啊,这个呢,咱们就不给大家演示了啊,行,那下边的话呢,这是一个具体的描述。对吧,这是个具体描述,这个描述的话呢,咱们就用个图来表示了啊,看图说话是吧?行,那现在呢,是咱们一个方法的入口,我现在要调用这个方法了,那这个方法的话呢,呃,是解释执行啊还是呃及时编译啊,哎,我们先看一看你这个方法在调的时候呢,是不是已经被GI it编译过了,哎一看是啊,那是的话,当然我们直接呢,是不是就调用这个机器码或者叫机器指令去执行了,效率很高是吧?诶真的是是的这条路径,那如果说你要是,诶这个当前的还没有被。
10:11
J编译过,那这时候呢,我们先把你这个方法计数器呢加个一,加一完以后呢,诶万一要这时候够了呢,所以加完一以后,我们看一下是不是超过预值了。看这是经这个叫什么热点代码呢,统计是吧,看是不是超过了,超过了那要是超过的话呢,咱们就提高提交这个叫编译请求,Git编译器是不是就开始发挥作用,然后给你后台呢,进行即时编译,然后呢,注意咱们一定要把你编译以后的这个机器指令啊,给它缓存起来。咱们前面呢,给大家强调过好几个场景是吧,都说过这个事儿,讲方法区的时候提到过,我们说方法区里边放什么,其中就提到过GI这个代码缓存啊,而且呢,在咱们这个图当中,诶,我这呢也写出来了方法区的一个代码缓存。哎,这呢,是不是使用的是咱们这个叫什么呀,圆空间呗,圆空间啊,是不是用的叫本地内存啊,诶所以说这个叫本地内存的code catch也行啊,总之呢,这个在JAVA8以后呢,方法区的落地实现源空间啊,使用的是本地内存啊,所以呢,这怎么写都可以啊。
11:09
好,那么如果说你加一以后呢,还没有超过这个阈值,那没办法了,那就接着执行呗。哎,就是这样的一个套路。很清楚是吧,这呢就是我们这个方法调用计数器啊,很好理解啊,就是什么场景下呢,我们需要呢,进行一个git。好,那这块呢,还有一个问题,就是你说我们这个呃数,比如说咱就用这个默认的叫1万,但是我始终也达不到1万,那这个数我们是不断的去往上累加吗?啊一直累加吗?哎,你要是一直累加的话呢,那是不是总有一个时间能达到1万,那延ID呢,就是如果我们这个程序呢,只要你是执行的时间足够长的话呢,我们一定是可以把几乎所有的代码是不是都可以进行个git啊。能理解是吧,哎,所以这块呢,一般呢,我们还涉及到叫热度衰减啊,叫热度衰减。啊,你看怎么样来说的啊,说呢,如果不做任何的设置啊,咱们这个方法调用计数器呢,它的统计方法呢,它不是统计这个叫绝对次数的。
12:06
啊,它呢是有一个叫相对判断一个相对执行的一个频率,也就是说呢,呃,它是在一段时间之内呢,咱们计算一下这个次数,诶超过这个一定时间限度的话呢,我们就要给你把这个呃计数器统计这个值啊,给你减一减啊减少一半。啊,减少一半,这个减少一半这个事儿啊,咱们称为呢叫衰减。啊,那你多长时间给我减少一半啊,这个呢,我们把这个时间呢,成为一个叫半衰周期。啊,这个概念衰减半衰周期是不是就是我们化学当中这个放射性这样东西,它的一个衰减是吧,就是我们统计古代说你这个呃这个嗯,古代的这样的一个一个一个一个,咱们比如说在图里边挖到一个东西,这个东西呢,是多少年前的一个东西,实际上呢,就是通过他这里边这个没记错的话,应该叫碳60吧,诶看看他这样一个衰减的一个情况,因为它每隔一定的这个周期,它就会有一次衰减,那我们看一下它现在的存量呢,往前去推就知道呢,这个东西呢,是多少年前的。
13:02
哎,就是这样一个概念啊,这是化学上的一个概念,那应用到我们这里边儿啊,衰减啊,半衰周期。很好理解是吧?啊,这个事儿不困难啊。啊,就相当于呢,就跟咱们说这个,呃,有时候呢,这个不同的这个体系当中,这个升值一样,说你几年之内啊,你得升上去啊,几年之内呢,再升上去,这个呢,咱们称不上叫平步青云吧,这算正常的一个升的一个模式啊,屏幕青云呢,就说你这个比这个时间还短,就升上去了,有的时候呢,你要是这几年没升上去的话呢。就可能会比较尴尬,那可能后边升起来呢,就会比较慢了。啊,这呢,不光是应应用于咱们说这个国家的这个公共系统啊,实际上呢,在这个,呃,咱们以说这个阿里为例吧,诶在阿里里边呢,其实大家呢,比如说你现在是一个P6,那P6的时候呢,你通过这个三年的时间呢,诶你会升到这个P7,那那后边呢,在再升到这个P8的时候呢,这个概率就低很多了,那当然呢,一般呢,在不同的公司里边,它大概呢,也多少有一个默认的一个时间是吧,呃,三年也好,还是三年到五年也好,你得升上去,如果你要没升上去的话呢,你可能只是一个PC加,哎待业呢往上涨了涨,但你再往上涨的时候呢,就可能性不大了,已经过了那个时间了。
14:14
啊,就像这里边,你在这一定的半衰周期之内呢,你没有达到我们这个呃阈值,没有达到阈值的话呢,我直接给你衰减一半,然后你再去往上去累计这个分数吧,哎,就成这样了。也也能理解是吧,包括一些这个商城里边也有这样一些,比如说你达到多少分数以后呢,你可以五折是吧,可以抽奖,然后呢,你这个时间节点呢,是你这一年的时间,你这一年时间你达不到这个分数的话呢,他下一年呢,就清零或者让给你减一部分。包括呢,像京东那个积分啊,京豆啊等等,好像也有类似这样规则是吧?诶都是这样的一个套路啊,再就呃希望呢,你在指定的一个时间之内,你达到一个数,那你就不断的得去消费啊,就这样是吧?行呃,那下面来说的就是说呃,如果呢,大家呃想去关闭这个衰减的话,那你要关闭衰减,那就不是一个相对的一个执行频率了,而是呢,是不是用绝对次数啊,那就是叫u cer来dek。
15:08
啊就有点像呢,说你这个嗯嗯,淘宝好像是这样,就是你达到那个多少那个积分以后呢,好像就办变成那个叫什么什么会员了,诶淘宝是吧,诶这个呢,也是他以一年诶清一次啊,那你要是把这个呢,关掉了以后呢,那就是说就不请了啊,你就不停的往上垒就行,那迟早呢,你在这买东西,你两年不行,三年三年不行,五年你总有一天是有可能达到这个数的。因为你不断的往上涨嘛,这个呢,就是关闭这个,诶热度衰减啊,那这是一个参数,另外呢,我们还可以通过这个参数叫counter half lifetime。啊,通过这个参数呢,咱们去设置这个半衰周期啊,你这个办税周期呢,单位是个秒,说你这个呃,时间呢,咱们可以设置的这个短一些啊,你就要很短的时间之内,要是没达到这个阈值,那你就衰减一半啊设置的长一些,那这个无限的长,其实就相当于是呢,我们类似于是关闭的这个半衰周期是衰减这样一个事了。
16:01
行,这个不复杂啊,咱们通过生活中的例子呢,也很好去理解它,然后下边这个呢,叫做回编计数器,回编计数器呢,就是统计这个方法里边的一个循环体执行的一个次数的啊,在在自建码中遇到这个控制流后啊,跳转的这个指令呢,称为叫回编。那也会触发这个,我们说这个osr是吧?行,呃,那么这呢也画了一个图,呃,这里边主要这个特点呢,就是说我们这个汇编计数器,当你某个循环体呢,呃,被循环执行的时候呢,我们就要加一,然后呢,它跟我们说的方法呢,计数器合在一起,如果说超物理阈值的话呢,我们就使用这个叫这个GI it即时编译。对吧,还就这样的一个思路,行,那这呢,咱们就给大家呢解释了一下,就是我们什么时候呢,呃,要触发这个叫gat。你看什么时候要出发,这呢我们判断那个标准是什么,哎,这呢就说清楚了啊。
我来说两句