java基础篇——jvm的解释器、编译器(JIT)

之前写的太粗糙,相信很多朋友看了并没有太大的收获;所以重新整理一份更细粒度的总结,欢迎大家评论指正,共同进步   ^ _ ^

概述
        有的朋友喜欢叫做解释执行和编译执行,这其实对新手来说并不好理解;这里将这两种执行方式所用到的核心组件进行说明
解释器和编译器负责的是两种将字节码编译成机器码的方式。目的都是将字节码转换为机器码来使程序能够在本地运行,只是触发的时机和执行过程会有所不同;解释器是在程序运行时的默认选择的方式,而编译器是指需要执行的字节码属于热点代码时才会触发。
        启动jvm前。我们可能会用eclipse、idea来编写我们的java代码,启动程序时,工具会根据我们配置的jdk中的jvm来将java代码编译为.class的字节码文件,接着jvm会将我们已经编译好的字节码文件编译成机器码,并保存起来;之后jvm开始启动程序。

解释器在jvm启动程序时立即开始工作(因为代码要运行嘛不然程序怎么跑呢)
        解释器的解释性编译:jvm启动程序时,解释器顺序处理当前要运行的字节码,每处理一行字节码都会根据热点代码的算法进行计数,如果当前处理的这行字节码达到一定次数的则会被认定为是热点代码,将会把这行字节码交给编译器处理,再次处理这个行字节码时就会交给编译器执行;否则继续执行,找到对应的机器码(其实就是一串二进制),然后执行。这样执行效率很差,因为是读一行字节码,找一行机器码,执行一行机器码

        JIT编译器:如果当前需要执行的字节码经常被执行则会被判定为热点代码,JIT算法会对这段热点代码进行分析(一般是一个函数,而不是像解释器一行一行的处理字节码),然后编译成一段被优化过且精简的机器码;这段机器码可重复使用,而且效率高很多;编译器分c1和c2编译器

这两者的关系是,在解释和编译字节码之前会判定其是否被编译器处理过,如果是,则会使用编译器编译后的机器码,否则进入解释器的工作流程。解释器本身是运行jvm程序的必备组件,因为只有将字节码解释为机器码才能在本地运行;而编译器是为了能让程序在运行过程当中跑的更快而附加上去的设计,编译器可以理解为是在潜移默化的将字节码预编译为机器码(而且这种预编译的机器码相对解释器解释出的机器码执行效率更高更精简);
在这里插入图片描述
以上说明的是针对与分层编译中混合编译的情况下,所谓分层编译:
一层:解释器编译
二层:编译器编译(仅使用c1编译器,拥有常规的优化机制)
三层:混合编译,解释器和c1和c2编译器(能够代码进行高性能优化)同时使用,使用哪一层的编译方式可以控制的
新版本的jvm默认都是采用混合编译模式

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值