2017-08-10 106 views
-5

这个问题总是存在于我的。这些.class文件的权力是无处不在的。我在技术上知道它是可移植的。但是会喜欢以外行人的名义和有趣的例子听到java中的.class文件如何在几乎所有的环境中运行

在此先感谢。

+6

三个字母的答案:** JVM ** –

+1

请参阅维基百科:https://en.wikipedia.org/wiki/Java_bytecode – howlger

+0

请参阅[关于Java技术](https://docs.oracle.com/javase) /tutorial/getStarted/intro/definition.html)。 – Jesper

回答

0

我会尽量以尽可能简单的术语来解释这一点。

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

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

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

由于存在不同的处理器体系结构(不同种类的处理器)和不同的操作系统,因此需要不同的JRE。有一个用于Windows 32位的JRE,一个用于Windows 64位,一个用于Mac等。

这里有一个比喻:

你用英语写的东西,你想日语的人,一个中国的扬声器和扬声器朝鲜明白你写什么。你怎么做到这一点。您分别聘请了日文,中文和韩文的翻译员!这样所有3个人都能理解同一个英文文本!

0

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

通常这是一对一映射(对于像逻辑二进制操作这样的事情)。但是,这可能要复杂得多,为了获得良好的性能,需要分析可能长序列的字节码。这就是自适应编译进来的地方。它使用Just-In-Time(JIT)编译来在应用程序运行时编译代码的HotSpots。当你开始执行一个循环时,JVM会注意到对同一个方法的重复调用并编译和缓存该方法,所以不需要每次都解释它。

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

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

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

相关问题