[RealTime]Java即时编译技术的了解

来源:互联网 发布:gre模考软件 编辑:程序博客网 时间:2024/06/09 23:45

简述

Java语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言。尽管这些语言可以提供更高的性能,但是生成的代码只能在有限的几种系统上执行。在过去的十年中,Java 运行时供应商开发了一些复杂的动态编译器,通常称作即时(Just-in-time,JIT)编译器。程序运行时,JIT 编译器选择将最频繁执行的方法编译成本地代码。运行时才进行本地代码编译而不是在程序运行前进行编译(用 C 或 C++ 编写的程序正好属于后一情形),保证了可移植性的需求。有些 JIT 编译器甚至不使用解释程序就能编译所有的代码,但是这些编译器仍然通过在程序执行时进行一些操作来保持 Java 应用程序的可移植性。参考自实时java。C++中也有动态链接的技术,看来和Java的这种动态编译还是有差别的。

Java程序的运行

使用Java SDK 的 javac编译Java 程序为本地的与平台无关的格式(类文件)。可将此格式看作 Java 平台,因为它定义了执行 Java 程序所需的所有信息。Java 程序执行引擎,也称作 Java 运行时环境(JRE),包含了为特定的本地平台实现 Java 平台的虚拟机。

Java字节码的执行

Java编译后是字节码序列,字节码序列描述了Java 类中每个方法所执行的操作。字节码使用一个理论上无限大的操作数堆栈来描述计算。这个基于堆栈的程序表示提供了平台无关性,因为它不依赖任何特定本地平台的 CPU 中可用寄存器的数目。可在操作数堆栈上执行的操作的定义都独立于所有本地处理器的指令集。Java 虚拟机(JVM)规范定义了这些字节码的执行。执行 Java 程序时,用于任何特定本地平台的任何 JRE 都必须遵守 JVM 规范中列出的规则。大多数本地平台是不能直接执行 Java 字节码的。JRE通过解释字节码来执行 Java 程序, JVM 在一个循环中重复操作:
- 获取待执行的下一个字节码
- 解码
- 从操作数堆栈获取所需的操作数
- 按照 JVM 规范执行操作
- 将结果写回堆栈
从这点看,和程序在机器上直接的执行过程是非常相似的,只是机器会有寄存器来暂存数据,所取得的也不是字节码,而是指令。
这种方法的优点是其简单性:JRE 开发人员只需编写代码来处理每种字节码即可。并且因为用于描述操作的字节码少于 255 个,所以实现的成本比较低。当然,缺点是性能:这是一个早期造成很多人对 Java 平台不满的问题,尽管拥有很多其他优点。
解决与 C 或 C++ 之类的语言之间的性能差距意味着,使用不会牺牲可移植性的方式开发用于 Java 平台的本地代码编译。

JIT编译

Java的本地编译本质上是特定于平台的。Java 平台需要在不牺牲平台无关性的情况下实现本地编译的性能就是使用 JIT 编译器进行动态编译:
这里写图片描述
使用 JIT 编译器时,Java 程序按每次编译一个方法的形式进行编译,因为它们在本地处理器指令中执行以获得更高的性能。

0 0