Java JVM进程的编译时间结束和运行时启动时
我是JVM新手,对JVM类加载和执行阶段的编译时和运行时的概念感到好奇。因此,在JVM过程中,编译从哪一点结束,运行时从哪一点开始。 对于JVM进程,我指的是Java JVM进程的编译时间结束和运行时启动时,java,jvm,Java,Jvm,我是JVM新手,对JVM类加载和执行阶段的编译时和运行时的概念感到好奇。因此,在JVM过程中,编译从哪一点结束,运行时从哪一点开始。 对于JVM进程,我指的是ClassLoader(加载-->链接-->初始化)运行时数据区执行引擎(解释器-->JIT编译器-->GC)的进程 我们讨论的是基于热点的JVM。(其他JVM体系结构的行为可能不同。) 我们谈论的是JIT编译,而不是Java源代码编译。(Java源代码编译发生在字节码加载之前,通常1发生在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编译、垃圾收集)都可能在任意时间发生,重叠或同时发生。试图用你发布的方式将它们分开,似乎源于一种自四分之一世纪以来就过时的描述。