【问题标题】:JIT compiler and anonymous inner classes [closed]JIT 编译器和匿名内部类 [关闭]
【发布时间】:2012-10-13 22:57:36
【问题描述】:

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

我想知道 JIT 编译器是否足够聪明,可以理解它们每次都会执行一些代码并编译成原生代码?

【问题讨论】:

  • 您能再解释一下吗? JIT 编译器将创建(并优化)每个匿名内部类,就像创建任何其他类一样。
  • JIT 编译器的职责是将字节码翻译成底层执行平台可以理解的本地语言。在此编译期间,还会为每个翻译的块添加性能计数器。每次执行代码块时,计数器都会增加。如果计数器达到阈值(通常为 1500 次调用),则该块将永久编译为本机代码。我的问题是,JIT 编译器是否理解来自匿名类的方法调用实际上是调用同一个块并增加计数器或假设它是不同的调用?
  • @mspapant 请解释一下“要求同一个区块”是什么意思; JIT 编译器如何明确识别它;以及它会有什么不同的语义让你认为 JIT 编译器会以不同的方式对待它。

标签: java optimization compiler-construction


【解决方案1】:

与任何其他代码一样,一旦执行了足够多的时间(默认情况下,Hotspot 服务器 VM 为 10000,客户端 VM 为 1500),JIT 编译器将对其进行编译和优化,因此 JIT 有足够的数据作为优化的基础。

仅仅因为它是匿名的并不意味着它的处理方式有任何不同:它仍然是一个类,在编译期间生成一个名称 (MyClass$1)。

【讨论】:

  • 也许你是对的。由于 javac 编译器将匿名类“转换”为......命名为 MyClass$1 等,因此没有理由不应用与“常规”类相同的优化。
  • @mspapant 没有“可能”。弗兰克是对的。为什么 JIT 或 HotSpot 应该关心类的名称?
  • 到那时,无论如何它只是字节码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2014-09-19
  • 2014-06-09
相关资源
最近更新 更多