java - JIT 不编译大型方法的理由是什么?

标签 java jit

我想知道为什么 JVM 的 JIT 编译器在编译时忽略“巨大的方法”。 (除非 DontCompileHugeMethods 标志设置为 false。)与此同时,大多数关于 Java 的 JIT 编译器的讨论都指出内联是一种 super 优化,因为它允许增长大量需要编译的指令。这个更大的编译上下文可以更好地优化执行的代码。有了这个,我会假设一个巨大的方法与一个大量内联的方法没有太大区别,并且应该是 JIT 编译的一个很好的目标。我在这里缺少什么?

最佳答案

基本上编译大量方法的投资返回率很低。

  • 热点代码通常很短。

  • 即使一个巨大的方法被频繁执行,热点部分也不太可能覆盖整个方法。 例如。考虑一个大型的 switch 语句,其中只有少数 case 标签经常被执行。 然而,编译单元是一种方法 - 因此 JIT 代码的大部分将是一种浪费。

  • 大量方法的编译需要大量时间和空间。而且,编译时间不会线性增长。 编译几个小方法反而会更有利可图。

  • 太长的机器代码会污染指令缓存。

  • 某些优化更适用于较小的代码片段,例如寄存器分配或循环展开。

  • 如果单个方法大于8K字节码,反正看起来写得不好。

关于java - JIT 不编译大型方法的理由是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24927813/

相关文章:

c# - .NET CLR 是否真的针对当前处理器进行了优化

用于生成 Java 源代码的 Java/Scala 库

java - KeyPairGenerator.generateKeyPair() 线程安全吗?

java - 通过登录传递密码

V8 中的 JavaScript 编译

c# - 为什么 Math.Pow(x, 2) 没有针对 x * x 进行优化,既不是编译器也不是 JIT?

java - 无法使用 spring boot 找到 html 页面

java - 如何在android中获取IMEI、LAC/CELLID

Java 优化 : (Hotspot/Dalvik) Optimization of final method returning a constant?

c# - 需要一些帮助来破译来自 .NET JITted 代码的一行汇编代码