【问题标题】:How JVM does method lookup and invocation?JVM如何进行方法查找和调用?
【发布时间】:2014-09-29 17:49:08
【问题描述】:

方法驻留在哪里?例如,

class Foo {
  public void foo_test(){}
}

Foo f1 = new Foo();
f1.foo_test();

(new Foo() {
  public void singleton_test(){
    foo_test();
  }
}).singleton_test();

方法是驻留在类还是实例中?

JVM 是否进行方法查找(如 C++ vtable)?上面2个方法的调用是怎么发生的?

我在看这个页面:

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

但它只是简单地解释了查找过程,而不是地点或任何细节。


这个问题是专门与Oracle JVM相关的。

【问题讨论】:

  • 你用你的(new Foo() {}).singleton_test();创建了一个新的匿名类。
  • 看看invokespecial和朋友们。
  • 未优化的方法总是通过查找调用,优化的方法即使是虚拟的也可以内联和消除。

标签: java jvm


【解决方案1】:

Java 中的所有方法都是虚拟的,除了标记为static 的方法。您的第二个示例只是创建了一个匿名内部类,其行为几乎与命名类完全相同。 (从这个角度来看,它的行为完全相同。)

没有指定方法查找的确切机制,这取决于 VM 实现。这也为智能优化留出了空间,例如,如果一个方法没有覆盖另一个方法并且被标记为final,它可以决定不需要额外的间接。

【讨论】:

  • 那么它会像 C++ 一样进行虚方法查找吗?它有 vtable 或符号表吗? Oracle JVM 是如何实现的?
  • @texasbruce 有很多策略,所以很难说。基本方法类似于 vtable,但代码也由 JIT 编译器优化运行时,因此方法甚至可能最终完全内联到调用代码中。但是从高级的角度来看,它应该总是表现得好像方法是虚拟的。
  • 这里有更多关于这个主题的阅读:stackoverflow.com/questions/1504633/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2012-06-04
  • 2015-12-31
相关资源
最近更新 更多