JIT编译器和匿名内部类

5

当我们使用框架或库时,通过匿名类的回调函数是一种常见的方法,因此了解JIT是否执行这种优化非常有用。

我想知道JIT编译器是否足够聪明,能够理解某些代码每次都会执行,并将其编译成本地代码?


你能再解释一下吗?JIT编译器将像处理其他类一样创建(并优化)每个匿名内部类。 - Augusto
JIT编译器的职责是将字节码翻译成底层执行平台所理解的本地语言。在此编译过程中,还会为每个翻译块添加性能计数器。每次执行代码块时,计数器都会增加。如果计数器达到阈值(通常为1500次调用),则该块将被永久编译为本地代码。我的问题是,如果JIT编译器了解匿名类的方法调用实际上是对同一块的调用并增加计数器,还是认为它是不同的调用? - mspapant
@mspapant,请解释一下您所说的“调用相同块”的意思;JIT编译器如何明确地识别它;以及有什么不同的语义使您认为JIT编译器会以不同的方式处理它。 - user207421
1个回答

5

像其他代码一样,只有在执行足够多次后(Hotspot服务器VM默认为10000次,客户端VM为1500次),它才会被JIT编译器编译和优化,因此JIT具有足够的数据来基于其进行优化。

只是因为它是匿名的,这并不意味着它被视为与众不同:它仍然是一个类,在编译期间生成一个名称(MyClass $ 1)。


你可能是对的。由于javac编译器将匿名类“转换”为命名为MyClass$1等的类,因此没有理由不将相同的优化应用于“常规”类。 - mspapant
@mspapant,这一点毫无疑问。Frank是正确的。JIT或HotSpot为什么要关心一个类的名称呢? - user207421
那时,它只是字节码而已。 - Frank Pavageau

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