Java JVM进程的编译时间结束和运行时启动时

Java JVM进程的编译时间结束和运行时启动时,java,jvm,Java,Jvm,我是JVM新手,对JVM类加载和执行阶段的编译时和运行时的概念感到好奇。因此,在JVM过程中,编译从哪一点结束,运行时从哪一点开始。 对于JVM进程,我指的是ClassLoader(加载-->链接-->初始化)运行时数据区执行引擎(解释器-->JIT编译器-->GC)的进程 我们讨论的是基于热点的JVM。(其他JVM体系结构的行为可能不同。) 我们谈论的是JIT编译,而不是Java源代码编译。(Java源代码编译发生在字节码加载之前,通常1发生在JVM启动之前。) JVM进程的编译时间结束和

我是JVM新手,对JVM类加载和执行阶段的编译时和运行时的概念感到好奇。因此,在JVM过程中,编译从哪一点结束,运行时从哪一点开始。 对于JVM进程,我指的是
ClassLoader(加载-->链接-->初始化)运行时数据区执行引擎(解释器-->JIT编译器-->GC)的进程

  • 我们讨论的是基于热点的JVM。(其他JVM体系结构的行为可能不同。)

  • 我们谈论的是JIT编译,而不是Java源代码编译。(Java源代码编译发生在字节码加载之前,通常1发生在JVM启动之前。)

  • JVM进程的编译时间结束和运行时启动时

    实际上,类加载、JIT编译、垃圾收集等都发生在运行时。没有阶段。。。如你所想

    (我想知道你的信息来源是什么。正如@Holger所指出的,它似乎已经过时了。)

    类的生命周期大致如下:

  • 类被加载,然后根据需要链接

  • 在某个时刻,某些东西会触发类的初始化。初始化由字节码解释器执行类
    伪方法来执行

  • 第一次调用任何方法时,都会使用解释器执行

  • 随着执行的继续,解释器收集并存储有关其正在执行的方法的运行时统计信息

  • 一旦达到给定method2的执行阈值,JVM就会触发对本机代码的JIT编译

  • 方法的JIT编译完成后,JVM将切换到使用该方法的编译本机代码版本。在调用方法的过程中可能会发生切换

  • 在某些情况下,JVM甚至可能会告诉JIT编译器重新编译它已经编译过的方法


  • 在所有这一切进行的过程中,JVM将管理堆、运行GC、完成对象、处理
    Reference
    队列等等

    在正常情况下,Java类在程序的生命周期内保持可访问性,并且不会被垃圾收集


    1-可以在运行时编译和加载Java源代码或生成和加载字节码。这些事情超出了本问答的范围。
    2-事实上,一种方法可能永远不会达到这个阈值。关键是JIT编译一个对总体性能几乎没有贡献的方法没有任何好处。

    3-如果类是通过动态创建的类加载器加载的,则在某些情况下可能会卸载并收集垃圾。这超出了本问答的范围。

    忘掉那些流行语吧。JVM的整个生命周期都是运行时。所有其他操作(加载、链接、初始化、解释、JIT编译、垃圾收集)都可能在任意时间发生,重叠或同时发生。试图用你发布的方式将它们分开,似乎源于一种自四分之一世纪以来就过时的描述。