如何在几乎所有环境中运行java中的.class文件

如何在几乎所有环境中运行java中的.class文件,java,Java,这个问题一直困扰着我。是什么赋予了这些.class文件到处运行的能力。从技术上讲,我知道它是可移植的。但我想听听外行的说法和有趣的例子 提前感谢。Java源代码被编译成字节码,字节码存储在编译器生成的.class文件中。这些字节码由Java虚拟机(JVM)执行。这里的线索是“虚拟的”。JVM获取每个字节码并对其进行解释,这意味着它将其从虚拟机表示形式转换为运行JVM的物理机表示形式。这样,一旦JVM被移植到一个新的硬件/操作系统组合中,所有Java代码都将在该平台上工作,保持不变 通常这是一个一

这个问题一直困扰着我。是什么赋予了这些.class文件到处运行的能力。从技术上讲,我知道它是可移植的。但我想听听外行的说法和有趣的例子


提前感谢。

Java源代码被编译成字节码,字节码存储在编译器生成的.class文件中。这些字节码由Java虚拟机(JVM)执行。这里的线索是“虚拟的”。JVM获取每个字节码并对其进行解释,这意味着它将其从虚拟机表示形式转换为运行JVM的物理机表示形式。这样,一旦JVM被移植到一个新的硬件/操作系统组合中,所有Java代码都将在该平台上工作,保持不变

通常这是一个一对一的映射(用于逻辑二进制操作)。然而,这可能要复杂得多,为了获得良好的性能,需要分析潜在的长字节码序列。这就是自适应编译的用武之地。这使用即时(JIT)编译在应用程序运行时编译代码的热点。当您开始执行循环时,JVM将注意到对同一方法的重复调用,并编译和缓存该方法,因此不需要每次都对其进行解释

JIT编译通常可以提供比传统的提前(AOT)编译更好的性能,特别是在Java这样的语言中,类可以在运行时动态加载。推测性优化和更积极的方法内联都可以使用JIT而不是AOT

OpenJDK提供了两个JIT编译器:C1和C2(有时称为客户机和服务器)。它们为它们的编译提供了不同的概要。C1升温更快,但提供较低的最佳性能水平。C1升温速度较慢,但优化效果更好。最近使用了分层编译,它从C1开始,然后切换到C2


Azul(我为他工作)刚刚推出了我们的C2 JIT替代品Falcon。这是基于LLVM开源项目,旨在更好地优化现代硬件。

我将尝试用尽可能简单的术语解释这一点

编写Java代码并将其保存在
.Java
文件中。java编译器随后将
.java
文件转换为
.class
文件

现在,这个
.class
文件包含什么?它是否包含处理器可以直接运行的机器代码?不,如果它真的这样做了,Java就不会是跨平台的
.class
文件包含Java字节码

没有处理器可以直接运行Java字节码。人们必须安装一种叫做“Java运行时环境”(JRE)的东西。JRE可以读取字节码!JRE解释
.class
文件中的字节码,并将其转换为处理器指令

因为有不同的处理器架构(不同类型的处理器)和不同的操作系统,所以需要不同的JRE。有一个用于Windows 32位、一个用于Windows 64位、一个用于Mac等的JRE

这里有一个类比:

你用英语写了一些东西,你想让一个说日语的人、一个说汉语的人和一个说韩语的人理解你写的东西。你是怎么做到的。您分别为日语、汉语和韩语聘请了一名翻译!这样3个人都能理解相同的英文文本

三个字母的答案:JVSEE维基百科:见Oracle的Java教程。