00:00
好,那在讲完这个解释器之后啊,咱们下面呢,来讲一下叫J器编译器,那前面的话呢,我们提到过这样一个图啊,大家应该都还记得。诶找一下就是这个里边成色呢,就是咱们说的这个Java程序编译的一个过程,就是我们使用这个Java c将Java源程序呢,编译成最起码文件的一个过程,然后呢,我们解释器呢,说的其实就是绿色的这一条执行路径,那么现在呢,咱们要讲的是这个蓝色的这一条执行路径,OK,这儿呢,属于我们两条执行路径,也就是说呢,咱们想让这个Java程序啊,咱们再来看一下这个图,想让咱们这个Java程序呢,或者说呃,这个可以运行在Java虚拟上的这个其他的一些编程语言啊都可以,那使得这些程序呢,能够真正使用我们本地的这个,呃,操作系统和硬件资源呢,做一个解释执行啊,做一个运行,那我们这里边呢,说是有两种方式啊,在你生成这个自解码文件以后是吧,两种方式,一种呢叫做解释器呢,逐条翻译执行,另外一个呢,就是使用我们叫即时编译器啊,将我们这个自解码文件翻译成本地机器指令,同时呢,来进行一个本地的缓存啊使用这样两种方式,那我们现在呢,要讲的就是这个第二种方式。
01:10
好,那我们再回过去看一下,我们要讲的这叫其实编译器啊,那首先说一下这个git编译器,大家就平时念的时候呢,就不要念成说git即时编译器了。啊,为啥呢?因为本身这个git,它这也是一个呃三个单词的缩写啊,它其实就叫做诶,Just in time,就是它翻译过来呢,就叫做一个即时的意思,所以呢,我们就直接呢叫做j it编译器,就不要再加即时这俩字了,就跟咱们有时候呢,说这个叫it是吧?呃,所以大家呢,大家是搞it的啊叫it技术啊,其实呢是有问题的,因为本身这个T呢叫technology,它本身就是叫技术的意思,就别翻译重了是吧,OK啊行,那么一开始呢,就提到说我们这个Java代码呢,要想执行呢,它有两种路径,刚才其实已经说过了啊呃,一个呢就是通过这个解释器执行,另外一个呢,就是这个使用我们这个叫机时编译的一个技术啊,将这个资金表文件呢,翻译成这个本地机器指令以后呢,再去执行啊,已经说过了啊,行,那么接下来看,对于咱们这个house score群体来讲。
02:10
啊,这呢是咱们这个Oracle自己呢,官方这个根正苗红的这个呃,虚拟机是吧,对于housewa虚拟机来讲,它呢,是市面上高性能虚拟机的代表作之一啊,传统的我们说有三个高性能的这个虚拟机是吧,就是典型的啊,就适用于相对来说普遍适用的各种场景的话。How和这个G9。啊,那现在G呢,已经被我们这个house呢融合在一起了,那另外一个呢,就是IBM的这个G9啊,但IBM这个G9的话呢,它呃是不是又只针对于它,其实也是针对于各个平台啊,但是的话呢,针对于IBM自己厂自己家的这个环境的话呢,应该说兼容性更好啊,在其他家这个产品上呢,其实兼容性呢,稍微的较差一些。哎,当然呢,除此之外呢,还会有这个像淘宝啊等等,都是基于这个open jdk啊集成的这个高性能的诈型机不具有这种普遍适用性啊,它是在人家具体的这个自己家的产品上呢,呃,性能非常高,那目前市面上高性能的,呃,典型的其实就是我们所谓的叫houseport对吧?那houseport类虚拟机的话呢,它就是采用的这叫解释器与叫即时编译器并存的一个架构。
03:14
啊,那在扎va虚运扎虚机运行的时候呢,解释器呢,和即时编译器呢,能够互相协作啊去执行,那到底呢,它是采用这个解释执行啊,还是采用这种其实编译的这个技术啊,哎,那只有呢house包虚拟它自己呢来进行一个判断了。那一会儿呢,咱们也要讲他判断的一个标准是什么是吧,那怎么去选择解释器,怎么选择编译器。啊是这样的,那他其实判断标准我们要用最简洁的话来说呢,就是各自呢取长补短。诶各自的取长补短,就是说呢,解释器有解释器的优势,诶编译器呢,其实编译器呢,有编其实编译器的优势。啊,那这里边儿呢,咱们先说一下这个即时编译器,它那个优势是什么,它的典型的优势就是比我们解释执行速度快。
04:01
BM解,执行速度快,因为呢,它已经将这个代码呢,是不是这个翻译成机器指令了,而且呢,缓存起来了,那你要是再去执行,我们每次呢,就直接呢去操作这个机器指令,那显然这个效率是不是非常的高啊,比你这个逐行再去翻译是不是效果要高,这个效率要高很多是吧?这呢就是我们说这个叫机制编译器,它的一个最明显的一个好处,速度快。是吧,啊那么以前的时候呢,也就是咱们讲这个JDK1.0的时候呢,Java虚拟机咱们是只有这个解释器的,说后来的时候呢,咱们把这个机时编译器呢,给它补充上了。啊,那补充上以后,包括呢,后续咱们对这个编译器呢,再进行不断的去优化,所以今天的这个Java程序呢,从性能上来讲呢,其实早已经脱胎换骨啊,甚至说呢,已经可以达到了跟C和C加加呢,可以一较高下的这样一个地步。啊,这个大家注意啊,就是以前呢,我们经常说是Java程序运行速度慢是吧?诶当然呢,这个相较于这个C和C加加呢,你要是写出高质量的C和C加的代码的话呢,确实可能还会有一些差别,但是呢,这个差别已经极小了啊,已经极小了,当你写的这个C跟C这个代码质量也不是说那么极其经典高质量的时候呢,其实跟我们这个Java程序呢,就凸显不出来,他们有一些性能上的优势。
05:12
是这种啊啊,以前的话呢,我们这个直观的概念呢,其实今天呢,会有一些变化,包括呢,在这个垃圾回收方面,Java呢,虚拟机底层不断的在进行这个优化啊,已经今非昔比。那这有一句话呢,叫什么说,曾经呢,你对我这个爱答不理是吧?今天呢,我让你高攀不起。这个这句话呢,看到以后呢,大家不知道自己呢,会不会有一些共鸣啊啊其实呢,我自己呢,呃整个呢走了,呃这么这个从大学毕业以后啊,这也算这个十几年的这个路程了是吧?哎其实呢,还是也有很多的感触,一方面是自己的这个情况啊,另外一方面也有身边一些同学啊,比如说像这个举个例子,像大学有一个女生是吧,呃,平淡无奇啊,就是感觉默默无闻啊,然后呢,呃不断的就就就读书是吧,后来读本校的这个硕士,然后读本校的博士,然后博士的时候呢,又去了日本,然后呢,后来又去这个香港大学去交流,现在呢,是作为这个香大学的这个访问学者是吧?啊然后的话呢,这个呃谈吐啊呃气质啊完全不一样啊,就完全这个,你在交流的时候发现跟这个高中的,呃,跟这个上大学的时候呢,完全就是两个人完全变掉了是吧,其实呢,呃,大家呢,可能现在学习的过程当中,你呢,可能是一个比较普通的一个角色,是吧,但是只要你在自己所在的这个领域当中,不断的去坚持去学习啊,我想想。
06:31
哎,我想大家呢,你学到这个GM呢,肯定呢还是对技术有所追求的是吧,否则呢,你可能现在看的不是GM,你看的应该是这个啊微服务架构是一些高并发的场景,看到一些是在应用层面的一些这个技术了。而不是呢,现在翻到我们这个底层来去看。啊,那大家呢,就是持续下来啊,这个这个不断的去积累自己的技术是吧,这个十月怀胎,你这个只要是时间久了也总能被人看出来,对吧?啊再举个例子,就像郭德纲一样。
07:01
那这个虽然说到现在为止,这个相声里,相声界里边还会有很多的这个所谓的这个大咖是吧,呃,还是在排斥郭德纲,但是呢,没有办法,那就是呃,郭德纲一手把这个相声呢,现在这个原来就快要绝迹的这样一门这个传统的艺术呢,把它发挥的淋漓尽致。是吧,哎,就是你不服也不行啊,你曾经呢,呃,爱答不理是吧,对我然后呢,现在呢,高攀不起啊,其实这样的场景呢,还是挺多的啊,有时候我们讲叫此一时彼一时啊,30年河东,30年河西,其实这样的例子呢,非常的多,不管是经商的诶,我们看到那些明企业家也好,还是说看到一些明星也好,其实无不例外呢,都是这样子的人,都是这样是吧?所以大家呢,就是呃,持续的努力啊,那你总是有凸显出来自己的一天。啊。行,这个我们接着往下说,呃,这呢是咱们以这个Java为例啊,来说的就是它现在的这个,呃,场景运行的这个性能呢,已经不差于我们说的这个C或者C加加了。行,那接下来呢,我们说一个问题,哎,刚才呢,我们其实埋了一个伏笔啊说呢,这个使用即时编译器呢,去执行的话呢,它的速度呢,是比我们这个解释器呢要快的,那既然如此,那我们干什么呢?还需要去保留这个解释器是吧?哎,两条腿走路那干什么,这条腿已经明显的拖累了是吧?那我们为什么不及时的把它砍掉。
08:19
啊说仅仅是因为说我们这个扎马逊机一开始的时候呢,有这个解释器啊,属于这个叫元老级的,然后呢,随着这个公司的发展,就比如说在这个创业公司一样,是吧?诶随着公司的发展呢,说这个解释器呢,这个元老呢,已经诶不太适合公司的这个当前的形势啊,是不,我们要及时的把它开掉,说哎,别开了,那毕竟是公司的元老,是从这个角度来解释吗?诶不是的,那绝对不是从这个人情的角度来解释,那我们写程序的话呢,根本也不用考虑这个人情的事儿是吧?OK,那到底是什么样的原因呢,让我们就保留这个解释器,那呢,这里边提到个词叫做各自取长补短。啊,那就说明呢,我们这个解释器的存在呢,还是有它的作用的是吧?哎,上面呢,就是我们描述的这个问题啊,为什么还要保留这个解释器来拖累程序的一个执行性能呢?哎,这里边我们要提一下说首先当我们程序在启动的时候呢,这个解释器呢,它可以马上的发挥作用,省去编译的时间,立即执行,这呢一句话就点明了我们解释器的一个主要作用。
09:15
就是解释器它的一个优势是什么呀?就是它一上来呢,就是拿着这个磁解码,我马上就可以逐条翻译执行,所以呢,解释器的优点相较于即时编译器,就是响应速度快,上来就执行对吧?而你这个GI器呢,它得需要呢,先去翻译是吧,翻译成这个机器指令以后呢,我们再接着去执行,所以它的这个响应时间的慢,但是一旦呢,它翻译成这个器指令以后呢,接下来他再去执行的时候,它的速度快了。对吧,所以他们呢,属于一个互补型的,各自有优势,那么编译器呢,要想发挥这个作用呢,它得翻译成本地代码,这个需要一定的时间,哎,这个呢,就是响应速度慢一些啊,后期的它的执行效率才高。啊是这种是吧,诶这是我们说的这样一个特点,那对于咱们houseor虚拟机来讲的话呢,咱们是二者呢就都有啊你看我这下边也写了是吧,对于咱们housewa虚拟机来讲,二者都有,就是当我们虚拟机启动的时候呢,解释器呢,首先发挥作用,它这个时候呢,不用等着这个即时编器呢去编译,把这个全部的这个代码呢都编译。
10:19
嗯,省去了不必要的一个编译时间啊,响应的速度比较快一些,然后呢,诶逐步的随着我们这个程序的,呃,速度呢,慢慢这个执行的时间呢,慢慢上来了,诶这里边儿提到一个叫热点代码探测功能,这个咱们一会儿呢讲这个细节,诶我呢将有价值的资金码呢翻译成本地机器指令,然后呢,再凸显出来,我们这个编译器的一个执行效率的提升上,啊就是有点像我们这个做饭一样是吧,这个菜呢得一点点热起来,那一开始的时候呢,我们用这个解示器让这个快速的响应啊去做一些执行,然后慢慢的话呢,诶我们这个代码的这个执行频率比较高的这些呢,我们给它翻译成本地机指令,再去执行的效率就特别高。诶,注意,这是咱们说houseport虚拟机的一个执行方式,大家记住它啊,那与之对应的另外一个呢,叫做g rocket。
11:06
啊,这个g rock的虚拟机,这是咱咱们原来说这个收购之前的这样一个虚拟机,它呢,里边就不包含着解释器。所以自解码呢,全部都是依靠即时编译性的翻译后执行的,诶那是不是就意味着我们这个只要它就砍掉了这个响应这一块,对响应时间呢,就诉求不是那么大了。大家想是这意思吧,诶那么什么样的场景,我们对这个响应时间不是这么关注啊,那主要呢,就是针对于咱们这个服务器端的应用来讲。那你想对于客户端来讲,咱们用户呢,最清楚咱们实际上是要求这个这个程序的响应时间是不是一定要到位啊,那这也是咱们为什么现在大家感觉这个iOS操作系统比安卓呢,操作系统要好的一个原因,实际上呢,从这个硬件啊,从一些功能的这个完整度上来讲呢,其实安卓呢,已经完全呃不亚于这个iOS了,甚至比它还要好是吧,但是呢,这个I呢,明显就是响应时间啊要好一些。啊,比如我们点一个图标一点立马就打开了啊,有的时候呢,你这个安卓手机用的时间长以后呢,点那图标一点没反应啊,点点点点不停点点挂了啊,就出现这样情况就响应上呢,用户呢,其实是最关注的,当然对于我们这个服务器端应用来讲,咱们更关注的还是性能。
12:14
对吧?哎,咱们更关注的还是性能,因为服务器端应用很多时候我们都是在启动的时候呢,花一些时间启动好以后,我们就一直让它去运行了啊,我们关注的更多的就是它的一个执行效率啊。所以说呢,从这个角度来讲,我们为什么讲说G的这个虚拟机是整个市面上呢,呃,说它是运行速度最快的呢,其实这块呢,也一定程度上呢,有一个解释。啊,那这里边提到了,说对于服务器端应用来讲,启动时间呢,并非并非呢,是关注的一个重点啊,对于那些看重启动时间的场景来讲呢,我们需要呢,他们在节制器和节制编译器中间呢,达到一个平衡点,也就是我们hotport群机你想要哎搞定的问题是吧,哎,这是一个事儿,另外一个呢,你看又解释了一个这样情况啊,看大家能不能理解说呢,这个解释执行和这个编译这个这个器的一种执行啊,咱们让它并存呢,还有一个好处。
13:03
就是我们在这个编译器编译的话呢,可以把这个解释器呢,当成是一种后备方案。如果呢,编译器一会儿咱们讲还有这个C1C2的编译器是吧,这个编译器呢,如果要是进行一个激进的一个优化,那在这个过程当中,如果不成立了,那这个时候呢,我们不能说这个程序就不执行了,怎么办呀,我们还可以用这个解释器呢,及时的逐行呢去诶这个翻译执行可以呢,作为咱们编译器的一个叫逃生门,或者说呢,叫后备方案。能理解是吧,哎就这意思,嗯,行,那这呢给大家举了一个这样的一个案例啊,这样的案例啊,就方便大家呢,更更好的去理解我们这样一个事儿啊呃,这呢是阿里团队啊这样一个案例,我们看一下。这个解释执行和编译执行呢,在真正线上这个环境当中存在着一种微妙的辩证关系。啊,这个就跟说呃,个别的一个男生跟一个女生一样是吧,你说他俩是情侣吧,他俩又不是,呃好像这个眼神呢,有一些跟别人不太一样是吧,这种微妙的这种关系是吧?那怎么体现这种微妙的关系啊,说这个机器在热极状态下可以承受的这个负载呢,它要大于这个冷机状态,就比如你刚启动的时候就叫冷机状态,然后呢,已经持续了很长,执行了很长时间了,这就就称为叫热机状态啊说如果呀,以这个热机状态的这个流量呢,进行切流,那有可能呢,就呃使得处于这个冷机状态,这个服务器呢,有可能会无法承载这个流量而假死。
14:24
就是同样这个配置,你要是把这个热机状态这个数据流量呢,直接切给这个同样配置这个冷级服务器的话呢,可能直接就挂掉了。啊,就是这样个意思,那举个例子哈,啊这呢,具体我们说应用这个场景,就是在生产环境中发布这个应用的时候呢,我们一般都分次分批次呢去发布。啊,然后呢,每个批次的这个机器呢,至少占到整个集群的1/8,有这样一个案例,说猛虫样呢,发布平台啊,这个进行这个分批发布的时候呢,在输入这个发布,发布这个总批次的时候呢,这个。分成两两批次去发布了,那如果要是热机状态的话呢,在正常情况下呢,一半的机器呢,勉强可以承载这个流量,当然呢,你是刚启动这个虚拟机,它是一个解释执行,这时候还没有这个热点代码和这个,那还没有这个这个代码呢,还没有判断出来哪些是这个高频度执行的热点代码是吧,也没有进行这个git的一个动态编译,所以呢,一上来呢,我们如果我们完全依赖这个解释执行,这一下子呢,就全部宕机了。
15:20
是吧,哎,这就出现了这样一个问题,这呢也间接的证明了咱们这个即时编译器它的一个作用啊,它的一个功劳,OK啊,就这呢,是阿里团队的这样的一个案例啊,文章就放到这儿了,也就是说呢,从这个最终的情况上来讲呢,就是对于house SPA虚机来讲,我们两条腿呢,都是必要的啊,我们要占据他们各自的优势。对吧,哎,就这样哈,那咱们通过一个简单的程序来说啊,这呢就是一个简单的举例哈,大家看这我这呢,就写了一个非常简单的一个例子,在这个main方法中呢,A list啊,循环的1000次,然后在这里边呢,我们是呃,添加了一个字符串,让天下没有男爵的技术啊,这是咱们商务追求的这样的一个目标,是吧,然后呢,是每一秒钟咱们呢,去往这个集合当中放一个数据。
16:04
行,就这样呢,非常简单的一个程序,然后我们把它呢跑起来。行,这一会半会呢,还执行不完啊,那个抛起来以后的话呢,我们可以看一下这个,通过这个JVSOVM呢,来看一下这个监控啊,打开这个程序。嗯,在这个,嗯,Visuals jc这块呢,哎,大家能看到这儿,这呢就是一个编译的一个次数啊,661次,669次,这呢就是使用我们这个机制编译器进行的一个编译,这呢是这个编译花花费,这叫毫秒数。啊,这个其实就是啊,这就是那或者的话呢,这个通过咱们另外一个工具呢,大家也可以看一下啊SMD,呃,使用这个叫j conso。哎,康呢,也是咱们这个JDK,哎,B目录下的这样的一个指令,跟咱们这个JVSOVM呢是一样子的啊,找到咱们这个J这样的一个进程。打开了对吧,打开以后的话呢,你看通过我们这个J康策话呢,其实也能够像之前咱们用这个JVVM一样啊,监控咱们,呃,这个堆内存啊,线程啊,CPU占用率啊,包括类的一个使用情况,这呢有一个叫VM一个概述,在这呢,咱们也能够看到,那有这个git编译器的一个存在啊,64位的操作系统啊,我们这使用的是它总编译的时间啊,在这也有写。
17:18
啊,就是对于housewa虚拟来讲呢,我们是有这个git编译器的啊,同时呢,也有这个解释器是吧?诶清楚这个事儿就行好,那这个清除以后呢,接下来咱们对这个编译器的细节啊,咱们再进行一个讲解。
我来说两句