JVM解释和编译指南
JVM解释和编译指南
为关注IT袋网网的网友们详解JVM解释和编译指南的相关介绍,接下来分享详细内容。
Java 是一种跨平台的编程语言。
程序源代码会被编译为 字节码bytecode,然后字节码在运行时被转换为 机器码machine code。解释器interpreter 在物理机器上模拟出的抽象计算机上执行字节码指令。
即时just-in-time(JIT)编译发生在运行期,而 预先ahead-of-time(AOT)编译发生在构建期。
本文将说明解释器、JIT 和 AOT 分别何时起作用,以及如何在 JIT 和 AOT 之间权衡。

源代码、字节码、机器码
应用程序通常是由 C、C++ 或 Java 等编程语言编写。用这些高级编程语言编写的指令集合称为源代码。源代码是人类可读的。要在目标机器上执行它,需要将源代码转换为机器可读的机器码。这个转换工作通常是由 编译器compiler 来完成的。
然而,在 Java 中,源代码首先被转换为一种中间形式,称为字节码。字节码是平台无关的,所以 Java 被称为平台无关编程语言。Java 编译器javac将源代码转换为字节码。然后解释器解释执行字节码。
下面是一个简单的 Java 程序,Hello.java:
//Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Inside Hello World!");
}
}
使用javac编译它,生成包含字节码的Hello.class文件。
$ javac Hello.java
$ ls
Hello.class Hello.java
现在,使用javap来反汇编Hello.class文件的内容。使用javap时如果不指定任何选项,它将打印基本信息,包括编译这个.class文件的源文件、包名称、公共和受保护字段以及类的方法。
$ javap Hello.class
Compiled from "Hello.java"
public class Hello {
public Hello;
public static void main(java.lang.String[]);
}
要查看.class文件中的字节码内容,使用-c选项:
$ javap -c Hello.class
Compiled from "Hello.java"
public class Hello {
public Hello;
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."
要获取更详细的信息,使用-v选项:
$ javap -v Hello.class
解释器,JIT 和 AOT
解释器负责在物理机器上模拟出的抽象计算机上执行字节码指令。当使用javac编译源代码,然后使用java执行时,解释器在程序运行时运行并完成它的目标。
$ javac Hello.java
$ java Hello
Inside Hello World!
JIT 编译器也在运行期发挥作用。当解释器解释 Java 程序时,另一个称为运行时 分析器profiler 的组件将静默地监视程序的执行,统计各部分代码被解释的次数。基于这些统计信息可以检测出程序的 热点hotspot,即那些经常被解释的代码。一旦代码被解释次数超过设定的阈值,它们满足被 JIT 编译器直接转换为机器码的条件。所以 JIT 编译器也被称为分析优化的编译器。从字节码到机器码的转换是在程序运行过程中进行的,因此称为即时编译。JIT 减少了解释器将同一组指令模拟为机器码的负担。
相关阅读
-
找装修公司去哪个网站好 网上找装修公司的小窍门
对于许多网友来说找装修公司去哪个网站好和网上找装修公司的小窍门IT技巧方面的经验,下面IT袋为您详细介绍 现在的互联网大大改善了生活便捷度,装修网站作为专业化装修服务平台,为广
-
如何实现一个IOC容器?
小编为大家说一说如何实现一个IOC容器的相关经验,一起来了解了解吧。 概括来说分为四步: 配置文件配置包扫描路径 递归包扫描获取.class文件 反射、确定需要交给IOC管理的类 对需要注入的
-
如何自建云服务器设置 搭建一个私有云平台
小编为网友们解答如何自建云服务器设置和搭建一个私有云平台方面的知识,具体详情如下: 如果选择云服务器的配置,总的来说要根据应用场景需求来。在云服务器的产品页面,会根据不同
-
深入学习:MySQL中查询重复数据的有效方法
一篇方法教程,与您分享的IT小经验,接下来分享详细内容。 在进行数据库操作时,我们经常需要找出重复的数据。 在MySQL数据库中,有多种方法可以实现这个目标。 本文将向你展示如何在


