我读过关于Just-in-time compilers的不同文章,并提到JIT将代码片段(热点)优化为直接的本机代码(机器代码)。我的问题是,每次运行.class file时,是否都会发生这种优化。另一方面,传统的compiled代码被一劳永逸地优化,而不仅仅是在一个execution (例如)中。
这类hot-spot optimization在machine中的“记忆”在哪里?
发布于 2014-01-17 21:27:28
这可能取决于JRE实现,但一般来说,每次启动该程序时都会重新执行JIT优化。除其他外,hotspot环境可以根据实际处理的输入数据的运行时分析来更改它们的优化。
是的,这与传统的编译语言有很大的不同。
值得注意的一点是:部分原因在于它依赖于输入,因此不能保证hotspot JIT每次都会以相同的方式优化代码。这使得手工优化Java代码变得更加困难。您确实需要进行完整的概要分析,并且需要对扩展的执行和完整的输入数据进行分析,否则您可能会欺骗自己。我在同一台机器上看到了20%的性能差异,在相同的输入下运行相同的代码,显然是因为JIT以不同的顺序进行了优化,并且在它愿意生成多少本地代码方面遇到了限制。
发布于 2014-01-17 21:24:32
JIT编译器产生的工件只存在于JVM进程的工作内存中。即使在同一过程中,由于一种乐观的假设或另一种假设无效,也经常会重新编译相同的代码。
注意,JIT编译可能比静态编译更具侵略性(在HotSpot上也是如此)--这主要是因为上面提到的乐观假设,静态编译代码负担不起这些假设。
发布于 2014-01-17 21:25:11
及时翻译只存在于程序运行期间。当程序终止时,JIT指令就消失了(但它们可能在下一次执行过程中重新生成--这取决于“热”路径)。
https://stackoverflow.com/questions/21196099
复制相似问题