开发者社区> 问答> 正文

Java编译与解释

_20180703104117
JDK1.8中的虚拟机采用JIT编译器,它采用编译与解释并存的mixed mode,根据方法的执行频率采用编译或者解释的方式执行字节码。当我使用javac命令编译的时候,是将执行频率高的方法编译成字节码,然后其他方法解释执行吗?这样子的话我用java执行的是.class文件,没有被编译成字节码的那部分代码是怎样执行的呢?如果javac将全部Java代码编译成字节码,那么解释执行的模式还有什么意义呢?

展开
收起
javar 2018-07-03 10:59:47 3479 0
2 条回答
写回答
取消 提交回答
  • Keep It Simple , Stupid. 独立博客:白水东城(www.baishuidongcheng.com)

    Java是解释性语言还是编译型的,这个我觉得不好说,倒不是骑墙。我的理解:Java源程序通过javac编译成中间代码class文件,这也是实现Java跨平台的方式(Java开发的程序交付一般都是jar或者war包,只要系统上有JVM就能运行了)。那么从class文件到机器码的过程呢?这时候就需要JVM出马了。JVM有三种执行模式:解释执行,编译执行,混合执行(默认是混合执行)。Java一共有两套解释器,一个是古老的字节码解释器,还有一个是现在正在用的模板解释器,模板解释器将每一条字节码和一个模板函数关联,模板函数中直接产生这条字节码执行的机器码,类似于活字印刷术吧,这便实现了解释执行。但是这要效率还是很低,尤其是出现热点代码的时候,比如函数被频繁调用。为了解决这个问题,JVM又提供了一种叫做JIT(just in time)编译的技术,即将真个函数编译成机器码,每次函数执行只要执行编译后的机器码就行了。
    TIM_20180904203303
    后来还出现了动态编译(Dynamic Conpiler)器,针对程序特性或者是让程序执行几个循环,在根据结果是否编译这段程序码。

    刚开始学的时候也有疑问,就是既然编译执行效率高为啥不都搞成编译执行模式而是要默认混合执行模式。首先来看一下编译执行和解释执行的优缺点,解释执行:解释一句执行一句,无需等待全部编译结束。编译执行:全部编译再执行,下一次再调用到这段代码的时候跳过解释直接用编译后的机器码。但根据28法则,20%的代码占用了80%的计算资源,那对于80%的不常用代码就没必要编译了,所以只对热点代码编译,当然我想jvm判断哪段代码编译哪段代码解释执行是综合考虑的

    2019-07-17 22:46:25
    赞同 1 展开评论 打赏
  • 你应该理解错了java虚拟机的编译与解释。
    java虚拟机的JIT编译,不是指从.java到.class的编译,是从.class到二进制执行代码的过程;当完成jit编译之后,相关程序的执行不会再涉及class到执行代码的编译过程,而是直接执行编译好的二进制代码;这是java代码运行速度能接近c的根本。

    而解释执行,则每次都是从class文件开始编译执行,运行会比较慢。

    2019-07-17 22:46:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载