Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java程序的编译和执行?_Java_Jvm_Jit - Fatal编程技术网

java程序的编译和执行?

java程序的编译和执行?,java,jvm,jit,Java,Jvm,Jit,我是java编程课程的初学者,到目前为止,这就是我对整个java程序编译和执行的理解。简要说明:- 1) 源代码(.java)文件由java编译器转换为字节码(.class)(这是一个中间代码) 2) 这个字节码(.class)文件是独立于平台的,所以wooosh…我可以将它复制到另一台有JVM的平台机器上 3) 当我运行字节码时,作为JRE一部分的JVM首先验证 字节码,调用JIT,JIT在运行时进行优化 信息技术 有权访问动态 运行时信息 4) 最后,JVM将中间代码解释为 供处理器执行的一

我是java编程课程的初学者,到目前为止,这就是我对整个java程序编译和执行的理解。简要说明:-

1) 源代码(.java)文件由java编译器转换为字节码(.class)(这是一个中间代码)

2) 这个字节码(.class)文件是独立于平台的,所以wooosh…我可以将它复制到另一台有JVM的平台机器上

3) 当我运行字节码时,作为JRE一部分的JVM首先验证 字节码,调用JIT,JIT在运行时进行优化 信息技术 有权访问动态 运行时信息

4) 最后,JVM将中间代码解释为 供处理器执行的一系列机器指令。(处理器不能直接执行字节码,因为它不是本机代码)


我的理解正确吗?有什么需要添加或更正的吗?

首先,java只是一种编程语言。这意味着您(理论上)可以运行一个编译器来生成这个字节码的本机二进制instad。(见:)


我应该提到的另一件事是能够直接执行Java字节码的Java处理器。。。因为这是他们的本机指令集(请参见:)

依次考虑您的每一点:

1) 这是正确的。Java源代码由javac编译(尽管其他工具也可以这样做),并生成类文件

2) 再一次,正确。类文件包含与平台无关的字节码。这些是“虚拟”机器(即JVM)的指令集。这就是Java如何实现自发布以来的“编写一次,在任何地方运行”的想法

3) 部分正确。当JVM需要加载一个类时,它会对该类的字节码运行四阶段验证,以确保字节码的格式在JVM中是合法的。这是为了防止生成可能破坏JVM的字节码序列(即类似病毒的行为)。但是,JVM此时不运行JIT。执行字节码时,它们以解释模式启动。每个字节码都会动态转换为所需的本机指令和操作系统调用

4) 当与第3点结合时,这有点错误

下面简要介绍了该过程:

当JVM解释应用程序的字节码时,它还分析哪些字节码组正在频繁运行。如果有一个循环重复调用一个方法,JVM将注意到这一点,并确定这是代码中的一个热点(因此命名为Oracle JVM)。一旦一个方法被调用足够多次(这是可调的),JVM将调用实时(JIT)编译器为该方法生成本机指令。当再次调用该方法时,将使用本机代码,从而消除了解释的需要,从而提高了应用程序的速度。这个分析阶段是导致Java应用程序“预热”行为的原因,在这个过程中,代码的相关部分逐渐编译成本机指令

对于基于OpenJDK的JVM,有两个JIT编译器,C1和C2(有时称为客户机和服务器)。C1 JIT将更快地预热,但最佳性能水平较低。C2升温速度较慢,但对代码进行了更高级别的优化,从而提供了更高的总体性能水平


JVM还可以丢弃编译后的代码,要么是因为它已经很长时间没有被使用(比如在缓存中),要么是因为JIT所做的假设(称为推测性优化)被证明是错误的。这被称为deopt,会导致JVM返回解释模式,重新编译代码,并可能使用JIT重新编译。

那么我的理解有缺陷吗?我的意思是我永远不能给老师这个答案?对于Java 8,在默认启用分层编译的情况下,我相信解释器可能会被跳过,取而代之的是一个(很大程度上)未优化的c1编译版本的方法,它将执行以前为解释器保留的相同类型的分析。但这可能取决于编译器队列的繁忙程度。根据Oracle文档(),“在分层方案中,除了解释器之外,客户机编译器还用于生成方法的编译版本,这些方法收集有关自身的分析信息”。因此,关于C1编译方法收集分析数据的说法是正确的,但是在编译这些方法时,解释器仍然在使用。很抱歉,响应延迟。最好的地方是Java虚拟机规范的第4.10节,其中涉及类文件的验证。可以在此处访问JVM规范: