00:00
然后最后的话呢,诶,咱们呢,再给大家总结一下啊,就是基于我们现在的现有的一个现状啊,现有的现状就是我们提到这个解释器编译器啊,编译器又分成C1和C2啊,那么写到最后的话呢,我们说在JDK10以后引入了一个全新的即时编译器啊,叫做啊grow编译器。包括呢,我们后边还有一个叫G虚拟机是吧,呃,应该说在不久的将来啊,这个这个虚拟机的话呢,是呃,完全有可能替代咱们housewa虚拟机的。啊,是有可能替代咱们housewa虚拟这个呢,大家只需要期待就可以了啊咱们呢,作为更多的是开发者是吧,或者基于我们open gdk呢,我们做深度一些优化定制虚拟拟的,诶咱们呢就诶更多呢,就参与不到人家这gra gra这个项目当中的是吧?诶我们更多的还是一个使用和优化的一个层面哈,行,那么引入了一个这里是以后呢,引入了一个全新的这个编译器,这个编译器呢,它在短短几年时间,这个呃,执行的这个效果啊,就已经追平了这个C2编译器了,就我们说这个serve,那未来可期是吧,那目前呢,还带有这个实验标签EG呢,就是它还没有正式的加入到我们JDK的这个,呃,确定的这个特性当中,呃,实验的这种呢,就是不确定是吧,就有可能还被干掉,但是一般情况下不会干掉啊,这个大家注意一下,就是现在呢,还正在进行一个修改,在下个版本当中可能还会修改啊,不断的进行修改,所以呢,都带一个叫实验的标一个标识啊。
01:26
大家可以呢,显示的,通过我们这样的指令呢,去开启就可以了啊这呢做一个了解啊,那再者呢,我们提出一个叫AOT的一个编译器。啊AOT就是这个呢,是跟咱们说的那个git呢,是并列关系的啊,咱们刚才说了一个叫grow是吧,Grow呢是即时编译器里边的一个,跟C2呢是并列的一个概念的结构啊,C1C2和这个gar,那现在呢,我们提到一个叫AOTOT是跟我们这个GI呢,是一个并列的概念。Git呢,我们称为呢叫即时编译器,即时编译器什么意思啊,就是我们在程序,哎,这个大家再注意听一下这啊咱们这最后了,虽然说也是个了解啊,你还是要关注一下啊,就是呃,我们这个即时编译器就是咱们的git呢,是在程序的运行的过程当中。
02:13
对吧,程序运营的过程当中,咱们发现呢,哎呀,有些代码呢,执行的频率很高,咱们呢,就成为热点代码啊,通过热点代码这个探测的一些技术,我们呢,考虑把它提前呢,编译成这个机器指令是在运行的过程当中咱们来执行的,而这个AOT呢,它称为叫a ahead time。叫提前贬义期。我前面加了静态,是因为它相交于我们这个,呃,动态来讲,它叫一个静态的是吧,它叫提前编译器啊提前编译呢,就是在我们这个程序运行之前,咱们就进行了一个操作了,哎,啥意思呢,我就不进行这个代码演示了哈,你像咱们这个点Java程序。哎,这个大家应该都知道啊,咱们点账号程序呢,是不是编译之后呢,就生成的叫点class,是不是叫四解码文件啊,然后这个时候呢,咱们诶把程序运行起来以后,嗯,咱们呢,使用这个叫git。
03:03
哎,使用这个JT是吧,它呢就是动态的帮我们做一个呃判断,然后呢,诶确定哪些代码呢,需要翻译成这个机器指令,而我们这里边这个AOT啊,你看在JDK9当中,我们引入了一个指令,这个指令呢叫接AOTC。那原来的时候呢,我们先编译啊,用的是javac那个指令,然后运行的时候呢,用的Java指令,那这个文件呢,我们可以去使用,咱们这个叫呃接AOTC,呃这个其实我放在这不太合适了啊,因为我们用的是个工具,使用这个工具的话呢,咱们就可以把这个词解码文件啊,在运行之前就给它翻译成啊,其实最后得到的是一个so文件啊,然后这个文件的话,我们再把它放在这个Java的这个动态的共享库当中。啊,对应的是叫叫DLL文件是吧,诶生成这个啊,那么由它在生成它的时候这个箭头,诶咱们这里边儿呢,就可以使用这个叫诶接AOTC这样的一个工具来做,那使用它呢来实现的。
04:02
注意这时候咱们程序啊,最后得到的这个文件呢,咱们还没有去运行程序呢,所以是在运行程序之前,相当于可以把我们自解码文件呢,翻译成对应的机器码。诶,还可以这样玩是吧?啊,那这样的好处是什么呀?想想好处怎么样,相当于我们程序呢,是不是在指令之前呢,咱们就把它翻译成这个,哎,算是叫机器指令对吧?啊,那就减少了我们一开始的这个预热啊,上来呢,咱们这个程序呢,是不是一下子这个相当于就进入这个机器指令的执行了。啊,就是减少了Java给人带来第一次啊运行慢的体验,因为咱们刚开始的时候呢,是不是要进行这个解释器的执行是吧,还得先判断,在你这个比如默认SERVER1万次之前,我们还是要解释器的执行啊,然后进行一个判断的过程。对吧,咱们不是讲过相应的两种方式吗?诶这个诶方法调用,哎,计数器和我们这个汇编计数器是吧。嗯,在。在这嗯在下边呢,诶方法调用计数器和汇编计数器还需要呢,走这样一个过程,而我们这个AUT的话呢,直接呢就把自己码文件翻译成这个记器指令了,那坏处是什么呀。
05:11
坏处呢?啊,咱们这个自解码文件本身呢,它是不是相当于咱叫诶跨平台的,就自解码文件本身也是跨平台是吧?咱们呢,就是在各个平台的这个虚拟机上呢,去运行就行啊可以实现呢,叫一次编译到处运行,当然呢,我们生成的这个呢,已经是诶这个机器指令了,那机器指令呢,咱们知道呢,是不同的硬件平台上这个指令是不是千差万别的呀?啊那你生成的这个指令呢,呃,再去运行,那这个指令的话呢,我们说就跟硬件呢有关系了,言外之意呢,它就打破了咱们Java所谓的叫一次编译到处运行这样的特点了。能理解吧,哎,因为咱们得到这个文件的话呢,是不是不同的音效平台呢,这个机器指令是不一样的的呀,咱们前面不是讲过指令集的问题嘛,是吧?诶这个大家能理解,那另外一个呢,诶非常重要的一个点就是说它降低了咱们Java链接过程的一个动态性。
06:00
哎,动态性咱们是在运行过程当中呢,做了一个及时的一个编译,呃,Java Java程序呢,是一个动态的,其实也一定程度上实际上一个动态的过程啊,比如叫VO dynamic,我们后边加入了这样的一个方法,调用的一个指令嘛,诶可以实现一个动态的一个调用,当然呢,我们提前已经编译成机器码了,那这个时候呢,就已经丧失了我们Java连接过程中这种动态性了。哎,这个大家注意一下啊,另外呢,就是目前呢,这个呃,AOT的一个使用呢,还仅支持在我们LINUX64位的这样的一个系统当中,所以呢,还在不断的去优化啊,大家呢就做一个了解啊,提前呢做一个呃关注啊就可以了。行,那么关于执行引擎这块啊,回过来咱们在最后看这一眼。哎,看这个图,那么关于直径引擎这块啊,咱们就是说完了。还说完了这个解释器编译器啊,里边呢,相应的这些细节啊,就都说到了,那应该说啊,在整个面试当中啊,关于这个执行引擎啊,问到的其实不算太多。
07:02
哎,其实不会太多,那大家呢,主要关注的点呢,就是诶通过这个图呢,我觉得还稍微形象一点哈,诶知道呢,我们houseor虚拟机它是一种什么样的场景。啊,无外乎呢,就是解释器有变异器,各自的特点是什么,为什么要混合着使用。然后呢,这个git的话呢,又分成C1C2啊,又提到叫AOTAOT的话是跟我们的这个JT呢,并列的关系,那除了C1C2之外呢,又出来一个JJDK10当中,哎,JDK10当中又出来一个叫grow是吧?哎,刚才提到它。嗯,行,整个呢就是这样子啊呃,那关于直行引擎呢,咱们就说到这儿。
我来说两句