每次我们使用"java className“命令运行Java应用程序时,都会创建一个新的jvm实例。执行引擎中的分析器识别热点,这意味着重复执行方法,并放置热点的本机代码。现在这样做,整个java应用程序将至少被解释一次,到那时热点被识别出来,所以下次如果我们运行java应用程序,那么这些热点的本机代码将被直接获取,并且不会被再次解释。现在我的问题是,如果我们再次运行java应用程序,那么将创建新的jvm实例,并且在以前的jvm中识别出热点。它怎麽工作?两者都是不同的jvm。
发布于 2016-09-24 20:38:59
如果我没理解错的话,主要问题是: JVM重新启动后,与相关的信息(热点和已编译代码)是否会被保留?
答案通常是否定的。JVM将所有这些信息保存在元空间中,所有这些信息都是在运行时创建的,然后在停止时消失。它不会持久保存在任何地方,当新的JVM再次启动时,JIT优化将被重做。
为什么是“一般的”:
在过去的几年里,有关于实际保存这些信息的讨论。OpenJDK社区正在考虑实现它,有一个付费解决方案实际上实现了这个功能作为它的主要卖点:
https://stackoverflow.com/questions/39675747
复制相似问题