为什么JIT编译器(Java)不保存结果?

4
当我从这里学习JIT编译器时: 什么是即时编译器(JIT)?

对于Windows上的Java JIT,不生成*.exe或*.dll。它将处理器指令写入内存(RAM)并从那里运行。没有必要创建一个带有文件头和所有内容的单独PE文件。

我的问题是为什么JIT编译器(Java)不保存结果?将编译代码存储以节省下次启动时间不是很有用吗?
(我的问题与上述问题不同,因为我强调了为什么

1
我认为这不是一个本质上的坏问题,但只有实际JVM的开发人员才能确切回答。很可能是因为保存内部JVM状态将是一项非常棘手的操作;话虽如此,请查看GraalVM。 - chrylis -cautiouslyoptimistic-
1个回答

4

JIT的输出可能因每次运行而异 - 它可以优化当前的负载模式。这有时允许它比需要可重用的预编译代码更积极地进行优化。

如果负载模式发生变化,发现优化为次优甚至逆向,JIT可以取消优化并尝试不同的优化。

(另请参见HotSpot动态反优化)

现在,为了节约性能,有时候保留各种已编译版本的结果并在以后重用它们可能是有用的,但这也需要大量的簿记才能找出某个代码部分是否已经使用当前相关的优化进行了编译。

我想这仅仅不值得去努力。这是在执行文件IO和通常快速编译小代码段之间做出的一种平衡。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接