java程序的编译和执行?
我是java编程课程的初学者,到目前为止,这就是我对整个java程序编译和执行的理解。简要说明:- 1) 源代码(.java)文件由java编译器转换为字节码(.class)(这是一个中间代码) 2) 这个字节码(.class)文件是独立于平台的,所以wooosh…我可以将它复制到另一台有JVM的平台机器上 3) 当我运行字节码时,作为JRE一部分的JVM首先验证 字节码,调用JIT,JIT在运行时进行优化 信息技术 有权访问动态 运行时信息 4) 最后,JVM将中间代码解释为 供处理器执行的一系列机器指令。(处理器不能直接执行字节码,因为它不是本机代码)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只是一种编程语言。这意味着您(理论上)可以运行一个编译器来生成这个字节码的本机二进制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规范: