繁体   English   中英

当 JVM 进程的编译时间结束和运行时间开始时

[英]when compile-time ends and runtime starts for the JVM process

我是 JVM 的新手,想知道关于 JVM class 加载和执行阶段的编译时间和运行时概念。 因此,在 JVM 过程中,编译结束,运行时开始。 对于JVM进程,我指的是ClassLoader (loading ---> linking ---> initialization) <-----> Runtime Data Area <-----> Execution Engine (interpreter ---> JIT Compiler ---->GC)

让我们清楚:

  1. 我们谈论的是基于热点的 JVM。 (其他 JVM 架构可能表现不同。)

  2. 我们说的是JIT编译,不是Java源代码编译。 (Java 源代码编译发生在字节码加载之前,通常1发生在 JVM 甚至启动之前。)

当 JVM 进程的编译时间结束并且运行时间开始时。

实际上,class 加载、JIT 编译、垃圾回收等都发生在运行时。 没有阶段......正如你想象的那样。

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

class的生命周期大致如下:

  1. 加载类,然后根据需要链接。

  2. 在某些时候,某些东西会触发 class 的初始化。 初始化由执行类<clinit>伪方法的字节码解释器执行。

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

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

  5. 一旦达到给定方法2的执行阈值,JVM 就会触发 JIT 编译为本机代码。

  6. 方法的 JIT 编译完成后,JVM 将切换到使用该方法的已编译本机代码版本。 切换可以在调用该方法期间发生。

  7. 在某些情况下,JVM 甚至可以告诉 JIT 编译器重新编译它已经编译的方法。


在这一切进行的同时,JVM 将管理堆、运行 GC、完成对象、处理Reference队列等。

在正常情况下3 ,Java 类在程序的生命周期内保持可达,并且不会被垃圾回收。


1 - 可以编译和加载 Java 源代码或在运行时生成和加载字节码。 这些东西超出了本问答的scope。
2 - 事实上,一种方法可能永远不会达到这个阈值。 关键是 JIT 编译一个对整体性能几乎没有贡献的方法没有任何好处。
3 - 如果通过动态创建的类加载器加载 class,则在某些情况下可能会卸载并收集垃圾。 这超出了本问答的 scope。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM