即时编译 – 它何时实际发生在Java中?

前端之家收集整理的这篇文章主要介绍了即时编译 – 它何时实际发生在Java中?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近我参加了关于 Java效率的讨论.
正如我所听到的,反对Java的大量论据是解释“非常耗时”,因为它甚至简单的Java程序运行速度比直接编译到机器代码的类似程序慢.

答案就是Java代码经常直接编译为机器代码,如果只有JVM计算它会使程序比以标准方式解释更快.

我的问题是:JVM何时“决定”执行即时编译?使JIT比标准字节码解释更有效的标准是什么?我的意思是,编译本身需要一些时间,据我所知,当程序已经运行时,它应该发生了吗?

解决方法

这取决于您的JVM及其设置.维基百科:

For example,Sun’s Java Virtual Machine has two major modes—client and server. In client mode,minimal compilation and optimization is performed,to reduce startup time. In server mode,extensive compilation and optimization is performed,to maximize performance once the application is running by sacrificing startup time. Other Java just-in-time compilers have used a runtime measurement of the number of times a method has executed combined with the bytecode size of a method as a heuristic to decide when to compile.[4] Still another uses the number of times executed combined with the detection of loops.[5]

对于vanilla HotSpot JVM in -server模式的粗略近似是当JVM注意到某个方法已被大量调用时,通常会超过某些特定次数,从而发生JIT. (这就是为什么JVM被称为“HotSpot” – 因为它识别并优化代码中的“热点”.)此时,JVM知道一些事情:

>它知道这种方法值得花时间进行优化,因为它会被调用很多.
>它对这个函数的真实世界特征了解很多:

>如果if语句的一个分支比另一个分支更常见,那么它可以改进branch prediction
>如果是传递给此方法的List通常是一个ArrayList,因此它可以针对ArrayList的特定情况进行优化和内联.

请注意,如果您事先编译为机器代码,则不会有大量此类信息需要优化 – 编译器事先并不知道哪些路径比其他路径更常见.但是,如果您等到实际数据之后再进行优化,则可以做出更好的优化决策.

关于JIT做什么的更多细节是here.

猜你在找的Java相关文章