zoukankan      html  css  js  c++  java
  • JAVA是解释执行还是编译执行的理解

    一次编译、到处运行说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平台都有相应的JDK,安装好JDK后也就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大的差异,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言运行的环境而已,所以才有了Java一次编译,到处运行这样的效果。

    严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。“一次编译,到处运行”这种效果跟编译器有关。编程语言的处理需要编译器和解释器。Java虚拟机和DOS类似,相当于一个供程序运行的平台。

    程序从源代码到运行的三个阶段:编码——编译——运行——调试。Java在编译阶段则体现了跨平台的特点。编译过程大概是这样的:首先是将Java源代码转化成.CLASS文件字节码,这是第一次编译。.class文件就是可以到处运行的文件。然后Java字节码会被转化为目标机器代码,这是是由JVM来执行的,即Java的第二次编译。

    到处运行”的关键和前提就是JVM。因为在第二次编译中JVM起着关键作用。在可以运行Java虚拟机的地方都内含着一个JVM操作系统。从而使JAVA提供了各种不同平台上的虚拟机制,因此实现了“到处运行”的效果。

      Java采用的是解释和编译混合的模式。它首先通过javac将源码编译成字节码文件class.然后在运行的时候通过解释器或者JIT将字节码转换成最终的机器码。

    单独使用解释器的缺点:

    抛弃了JIT可能带来的性能优势。如果代码没有被JIT编译的话,再次运行时需要重复解析。

    单独使用JIT的缺点:

    需要将全部的代码编译成本地机器码。要花更多的时间,JVM启动会变慢非常多;

    增加可执行代码的长度(字节码比JIT编译后的机器码小很多),这将导致页面调度,从而降低程序的速度。

    有些JIT编译器的优化方式,比如分支预测,如果不进行profiling,往往并不能进行有效优化。

    因此,HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。

    JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。

    注:JIT为方法级,它会缓存编译过的字节码在CodeCache中,而不需要被重复解释。

  • 相关阅读:
    Android打包报错 Export aborted because fatal lint errors were found. These are listed in the Lint View
    jqMobi 更小更快的移动框架
    php报错:Call to undefined function get_magic_quotes_gpc()
    php:字符窜截取substr和mb_substr
    Warning Creating default object from empty value in xxx.php
    linux下安装xampp
    程序员找不女朋友的原因
    键盘各种按键对应的ASII码
    Read All About It-Attraction舞团
    What are words-Chris Medina
  • 原文地址:https://www.cnblogs.com/AnXinliang/p/9842365.html
Copyright © 2011-2022 走看看