Java 分析器如何在执行引擎的JIT编译器中工作?

Java 分析器如何在执行引擎的JIT编译器中工作?,java,Java,每次我们使用命令“javaclassname”运行Java应用程序时,就会创建新的jvm实例。 执行引擎中的分析器识别热点,这意味着重复执行方法,并放置该热点的本机代码。现在这样做,整个java应用程序将至少被解释一次,到那个时热点已经被识别,所以下次若我们运行java应用程序,那个么这些热点的本机代码将被直接获取,不再被解释。 现在我的问题是,若我们再次运行java应用程序,那个么将创建新的jvm实例,并在以前的jvm中确定热点。它是如何工作的?两者都是不同的jvm。如果我理解正确,主要问题是

每次我们使用命令“javaclassname”运行Java应用程序时,就会创建新的jvm实例。 执行引擎中的分析器识别热点,这意味着重复执行方法,并放置该热点的本机代码。现在这样做,整个java应用程序将至少被解释一次,到那个时热点已经被识别,所以下次若我们运行java应用程序,那个么这些热点的本机代码将被直接获取,不再被解释。
现在我的问题是,若我们再次运行java应用程序,那个么将创建新的jvm实例,并在以前的jvm中确定热点。它是如何工作的?两者都是不同的jvm。

如果我理解正确,主要问题是:jvm重启时是否保留JIT相关信息(热点和编译代码?

答案通常是否定的。JIT将所有这些信息保存在元空间中,所有这些信息都在运行时创建,然后在JVM停止时消失。它不会在任何地方持久化,当新的JVM再次启动时,JIT优化将重新进行

为什么是“一般”:
在过去的几年里,有人谈论如何保存这些信息。OpenJDK社区正在考虑实施该功能,有一个付费解决方案将此功能作为其主要卖点:


所以,如果我们再次运行java应用程序,那么在创建新的jvm实例时,所有信息都将消失,那么识别热点有什么用呢?如何再次使用这些热点?JVM识别热点,因此它知道哪些代码部分需要编译成二进制。如果您想要重用来自JIT的东西,那么它将不是热点,而是实际编译的代码。但正如我在上面所写的,您不能重用它们。有一些技术试图提供这样的解决方案,但它们并不常见,也没有广泛使用,而且在99.99%的情况下,您遇到的任何Java应用程序都会在运行时执行JIT,正如其名称所示(即时编译器)。