00:00
接着呢,我们来看一下GM的一个发展历程啊,在这里边呢,我们会介绍啊,各个不同历史时期版本的Java虚拟机,那就好比面试当中,一旦问到说你都了解哪些,去哪些虚拟机呢?那除了houseboard之外呢,大家也能够说出来一些常见的Java虚拟机,虽然有一些已经不再使用了啊,但是呢,了解也是必要的,那首先我们来看第一个啊,叫S公司的classic啊VM,那九六年呢,我们知道一月份是JDK第一个版本发布,那第一个版本发布的JDK当中使用的就是S公司的这个classic讯机,也就是说呢,它是世界上第一款商用的扎讯机。啊,这呢是大家关注的第一个词儿啊,第一款商用的虚拟机,那这个在1.4的时候呢,就被淘汰了,这很自然而然的啊,就被淘汰掉了,那现在的话呢,咱们主流在使用的,或者说咱们默认的,不管是Oracle jdk还是open jdk啊,默认的虚拟机呢,都是house虚拟机,那这个house bar虚拟机呢,内置了classic虚拟机。
01:02
哎,这是首先大家关注的第一个问题啊,然后第二点,第二点我们想强调的就是中间它的一个特点啊,说这款虚拟机内部只提供了解释器啊,那如果大家之前没有关注过渣渣虚拟机的话呢,我这一说你可能有点迷糊哈,说什么叫只提供了解释器,因为现在主流的虚拟机呃,不管会提供解释器,还会提供叫即时编译器,呃,这个干说呢,有点干啊,嗯,看一下图,这些图的话呢,一方面咱们这个之前带着大家看过这个图。这呢是直引引擎啊,就直引引擎的话呢,我们说主要有三部分啊,解释器,即时编译器和垃圾回收器,那这呢是主流的,像解释器跟其时编译器是都需要有的,那刚才提到说classic呢,它只有这个解释器啊,是这样子的,那我们再换一个图让大家来看啊,是咱们后续呢讲解的时候呢,都会用到的,这些图我就都放这儿了,这呢是我们各个不同的语言,我这不是用的编程语言,而是用咱们人类的这个语言啊呃,编译辑完了以后呢,诶是一堆这个,我这是乱码这种啊,它没有意义,因为自解码文件嘛,咱们也看不懂,那接下来的话呢,放到我们GM当中,这里就提到了直行引擎中的解释器,就叫GI即时编译器,这两个结构呢,现在的虚拟都有的。
02:19
啊,他们是都有的,那真正呢,要让这个程序执行,其实呢,用其中的一个就可以,并不是说他俩是一个,呃,这是第一个环节拿到结果呢,再让第二个环节去用,不是这样子的哈,呃,他们用这两个都行,所以说呢,在我们一开始的虚拟机里边,它就只提供了这个解释器,说白了就是我们右边的这个git即时编译器呢,是没有提供的,那只提供解释器,嗯,有什么影响呢?你不是说二者都可以吗?这个如果只提供解释器的话呢,用咱们今天的眼光来看,执行的效率是比较低下的。啊,因为咱们Java虚拟机再去执行这个自建码指令的时候呢,就得逐行进行解释啊,程序的这个性能呢是比较差的啊,即使你有一些重复性的代码,比如我们写一个for循环啊,这个循环2000次,那中间那个循环体呢,也需要每次逐行的进行这个翻来覆去的每一次都进行解释执行,这个效率呢是比较低的啊,那要想提升效率的话呢,就需要考虑使用git编译器,呃,这呢就提到了它的一个作用啊,这个git编译器呢,咱们后边都会讲它的,咱们先先给大家介绍一下啊,它呢就是在程序执行过程当中,如果发现有一些代码反复的被执行,我们就把它称为叫热点代码,那确定了热点代码以后,咱们会把这个热点代码,也就是所谓的这个执行频率比较高的这个代码呢,给它及时的编译成本地机器指令,然后把这个本地机器指令呢,咱们就给它缓存起来了,诶当你。
03:56
下次因为热点代码嘛,反复的执行的时候呢,就不用像解释器一样逐行再去翻译了,所以呢,有了即时编译器,它能够提升我们程序的一个诶执行效率。
04:09
啊,一个执行效率,那刚才我们看到了说这个classic里边呢,是没有这个即时编译器的,但是你要想用的话呢,需要外挂,但是外挂以后呢,他俩只能二选一,是不能够协同工作的。啊,正常是都可以协同工作,现在他俩是不能协同工作,只要你用了这个即时编译器了,你就不能够再用解释器了。那这不挺好吗?大家会想这这不挺好吗?我们把所有的代码就不仅限于说热点代码啊,所有的代码我们都给它翻译,编译成这个本地机器指令,给它缓存起来不挺好吗?那大家想这里边会有什么问题呢?想一想,全部都缓存起来,而不是说只选择热点代码来缓存。啊好了,那这块我来说这个结论了哈,就是我们将这个自解码指令翻译成机器指令的时候呢,也是需要花时间的,对吧,也是需要花时间的,那如果我们把每一行的这个指令都翻译成本地机码,那必然呢会导致这个暂停时间呢过长。
05:14
暂停时间过长,那暂停时间过长导致呢,就是我们程序在刚开始启动的时候呢,会显得会有一段时间卡顿啊会卡顿,那为了让这个响应时间呢,呃,这个尽量呢不要太长,或者要暂停时间不要太长,那怎么办呢?那咱们就不能够使用这种编译优化效果更好的这个即时编译器。再说一遍啊,就是一方面你要是只用GI的话呢,它会让暂停时间有点长啊,这个程序一启动,结果中间呢,呃暂停的这个时间呢有点长,后边呢才开始真正执行了,暂停时间有点长,那怎么办呢?那我们这时候呢,就尽可能让这个呃编译成机器指令的这个呃即时编译器呢,就是它的优化的效率呢,就优化的这个叫什么技术呢,比别太高级了,太高级的话呢,这个暂停时间就过长了,那但是你要不太高级的话呢,这个呃效果呢又不会特别好,所以呢也导致呢,呃即使咱们用了这个即时编译器,最后发现跟C和C加加呢,也会存在一些差距。
06:17
啊,所以呢,在最初就形成了一个印象,就是Java语言呢比较慢啊,包括今天呢,很多人一提到了,也觉得说Java跟C比慢是吧,但其实优化到今天,毕竟Java生态很大嘛,很多的这个呃,顶尖的工程师呃,都参与到Java的这个体系生态当中呢,其实今天的Java虚拟机,它的执行速度已经不亚于四星C3加了啊,但在最初的时候呢,还是要呃差一些啊。那说这么半天,这个不知道大家有没有听明白哈,那我举一个生活中的例子啊,我想了半天,我想举一个什么例子呢?比如我现在是在这儿,这是一个地点哈,我现在想去B地,这个B呢,比如说是天安门啊,我我现在在北京啊,比如我现在想去天安门了,那一种呢,就是大家呃,我在这儿想去天安门怎么办呢?解释器呢,大家可以理解成就是不行。
07:07
就是我走。诶,这个你一喊开始,我立马我就开始走了,我就走路,所以说呢,对于解释器来讲,它的这个响应是很快的啊,它不需要这个这个像GT一样,把自己把指令再翻译成机器指令,它直接上来就执行了,诶朱航解释,所以呢,它的响应时间非常快哈,就是我一开始说让去天安门,我立马就步行开始走起来了,响应时间很快,那g it的话呢,可以理解成是我想坐公交车。那坐公交车的话呢,呃,我在公交车这个站点上,我得等,我可能一等等了十分钟,那十分钟呢,公交车都还没有来,那就理解成这个暂停时间呢,有点长,而这个第一种方式呢,它已经走了一段距离了,但是一旦公交车来了以后呢,我坐上去以后,诶,它的这个速度就很快了,有可能会超过这个步行的速度。嗯,那我们坐一趟公交车可能还到不了天安门,那怎么办呢?我就下来,下来以后呢,我可能还得再坐其他的公交车,那我们说传统的classic里边的GI,你就可以理解成,呃,我就是每次都都等公交车,我必须得把所有的这个路程都是用公交车来来来来实现,是吧,所以呢,就会导致呢,你可能等了很多次,呃,那这个成这个这个这是它的一个方式啊,那不行呢,就是全纯用这个解释器,那它俩应该搭配使用是什么样子呢?就是你坐会公交车下来以后呢,你发现诶我到另外一个地儿的坐,再坐公交车的时候呢,不绕远,那我就走几步,走几步到这儿以后呢,诶我再坐一趟公交车,下来以后呢,我再走几步,我就到另外一个点了,我再坐公交车,而不是说呢,每次都下来等新的公交车,有可能等的时间不如步行的时间快,所以应该把二者结合起来,这也是咱们现在虚拟机的一个主流,就是他们二者呢,同时哎,来这个解释这个编译咱们的程序。
08:57
去的执行啊,那说的可能有点啰嗦,甚至说也有点急啊,咱们讲到执行引擎的时候呢,再带着大家细节的来展开说明好。
09:09
这呢,就是我们说的这个叫classic vm啊。
我来说两句