2016-08-23 90 views
0

在企业应用程序中,相同的代码运行几天而没有重新启动,并且如果代码被多次命中,即大于阈值时间,那么它将会被编译(大部分),所以我想问为什么它不是编译在第一位..我的意思是jvm工程师可以编译代码到字节代码,以保持平台独立性和做一个更多的编译机器代码,不应该在一般情况下,机器代码更快,当它满足要求被编译的jit然后jvm可以使用所有的分析信息和统计信息来增强机器代码并完成所有的增强。当然,这将花费编译时间,但是通用代码不是每次都被解释,而是简单地执行.i.e创建一个编译器,它编译并夸耀它,以防某些方法变热。我可能在这里错了,但这是一个奇怪的问题。为什么java解释代码是否可以编译它?

+0

因为虚拟化有其好处,例如通过反射编程。 此外,关于效率问题,请参阅http://stackoverflow.com/questions/2426091/what-are-the-differences-between-a-just-in-time-compiler-and-an-interpreter –

+0

我我问为什么当我们编译时我们需要解释..我们可以先编译成字节码,然后jvm可以在编译时立即编译,所以不需要解释任何东西。我的意思是他们可以做虚拟化,并在程序开始时进行编译..虽然它会提高程序的启动成本 – 1arpit1

+0

那么,您如何看待Java将处理反射(在运行时查看对象的字段),运行时代理在运行时执行的代码)和其他类似的功能? –

回答

1

通过优化进行编译非常昂贵。查看大型C项目(例如firefox,linux内核)的编译时间,尤其是链接时间优化。

JIT也针对目标平台进行编译,即他们尝试使用它们可以支持的所有可用指令进行编译,这意味着您无法分发已编译的代码。

现在考虑JIT执行推测性优化(基于性能分析),这可能会导致错误并需要纾困。如果只有编译是一个选项,这个代码将不能继续运行,直到它被重新编译。通过解释器,它可以继续执行导致救援的非常见代码路径。

您还必须记住,某些优化是特定于工作负载的,即(不良)测试工作负载可能会运行与真实工作负载不同的代码路径,从而受益于在运行时进行配置后进行不同编译。

并非所有的应用程序都是长时间运行的守护进程。有些东西启动JVM执行一个任务,然后在完成时退出。

还要考虑很多代码只运行一次,例如,应用程序启动或关闭期间。

所有这些因素都有助于为什么一些默认情况下,JVM使用组合解释器+编译器。其他人可能仅使用AOT编译的代码,或者由于技术权衡不同而只能使用解释器,但通常不会更快。

0

它是多种因素和设计选择的混合物。

Java以字节码的形式提供,并且没有永久性构件依赖于平台。这是确保平台独立性的设计选择。 Android做出了不同的选择,主要原因在于它运行的平台越来越有限。

解释代码比编译和运行一次更快。 所以要有最好的表现与体面的启动时间。当你确定需要代码时开始编译是有效的。编译是在另一个线程中完成的,一旦准备好就使用二进制文件。当代码经常使用时,热点甚至会进行多次重复编译。它可以使用实际的动态运行时特性,所以二进制比任何只有静态信息的代码都快。

0

Java运行大部分代码,因为大多数代码运行速度足够快,并且不需要承担本地编译的开销。 JIT(HotSpot)引擎将优化高度使用的代码,在这种情况下,支付是合理的。此外,它将在上下文中优化,这意味着即使变量可能会在理论上发生变化,它也不会在特定的命令序列期间发生,因此序列可以将其放入寄存器或将其保持为常量。当假设被违反时,JIT将其重新置于解释模式。提前编译会失去运行时洞察的所有优势。 Java的方式实际上产生的代码比编译语言(如C++)可以实现的更紧密和更高效。

相关问题