zoukankan      html  css  js  c++  java
  • Java虚拟机解释器与编译器

    目前主流的两款商用Java虚拟机(Hotspot、Open9)里,Java程序最初都是通过解释器(Interpreter)进行解释执行的。在javac编译过后产生的字节码Class文件:源码在编译的过程中,进行「词法分析 → 语法分析 → 生成目标代码」等过程,完成生成字节码文件的工作。然后在后面交由解释器)解释执行,省去前面预编译的开销。java.exe可以简单看成是Java解释器。

    当虚拟机发现某个方法或者代码块的运行特别频繁时,就会把这些代码认定为「热点代码」(Hot Spot Code)。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT)。

    即时编译器不是虚拟机必须的部分,Java 虚拟机规范并没有规定虚拟机内部必须要有即时编译器存在,更没有限定或指导即时编译器应该如何实现。但是 JIT 编译性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键指标之一。

    解释器与编译器

    尽管并不是所有的 Java 虚拟机都采用解释器与编译器并存的架构,但许多主流的商用虚拟机,如 HotSpot、J9 等,都同时包含解释器与编译器。

    编译器:负责把一种编程语言编写的源码转换成另外一种计算机代码,后者往往是以二进制的形式被称为目标代码(object code)。这个转换的过程通常的目的是生成可执行的程序。编译器,往往是在「执行」之前完成,产出是一种可执行或需要再编译或者解释的「代码」。

    解释器:它直接执行由编程语言或脚本语言编写的代码,并不会把源代码预编译成机器码。它是把程序源代码一行一行的读懂然后执行,发生在运行时,产物是「运行结果」。

    解释器与编译器两者各有优势:

    • 当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地机器码之后,可以获得更高的执行效率。
    • 当程序运行环境中内存资源限制较大(如部分嵌入式系统),可以使用解释器执行来节约内存,反之可以使用编译执行来提升效率。

    同时,解释器还可以作为编译器激进优化时的一个「逃生门」,当编译器根据概率选择一些大多数时候都能提升运行速度的优化手段,当激进优化的假设不成立,如加载了新的类后类型继承结构出现变化、出现「罕见陷阱」时可以通过逆优化退回到解释状态继续执行。

    image-20200826153023981

  • 相关阅读:
    CSPS_108
    TortoiseGit配置密钥的方法
    SLF4J和Logback和Log4j和Logging的区别与联系
    slf4j log4j logback关系详解和相关用法
    dubbo服务telnet命令的使用
    基于IDEA的JavaWeb开发环境搭建
    jdk8--十大新特性
    jdk8--collect总结
    字符串的排列
    调整数组顺序使奇数位于偶数前面
  • 原文地址:https://www.cnblogs.com/code-duck/p/13565503.html
Copyright © 2011-2022 走看看