JVM如何进行方法查找和调用?

4

方法存储在哪里?例如,

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++的虚函数表)?上述两种方法调用是如何进行的?

我正在查看这个页面:

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

但是它仅简要介绍了查找过程,未提及位置或任何细节。

这个问题与 Oracle JVM 相关。


你可以使用(new Foo() {}).singleton_test();创建一个新的匿名类。 - Elliott Frisch
请查看invokespecial及相关内容。 - vanza
2
未经优化的方法总是通过查找调用,而经过优化的方法即使是虚拟的也可以被内联和消除。 - Peter Lawrey
1个回答

1
所有Java中的方法都是虚拟的,除了那些标记为static的方法。你的第二个示例只是创建了一个匿名内部类,其行为几乎与命名类完全相同。(从这个角度来看,它的行为完全相同。)
方法查找的确切机制没有指定,这取决于VM实现。这也为智能优化留出了空间,例如如果一个方法不重写另一个方法并且标记为final,它可以决定不需要额外的间接引用。

它像C++一样进行虚方法查找吗?它有vtable或符号表吗?Oracle JVM是如何实现这个的? - SwiftMango
@texasbruce,有很多种策略可供选择,所以很难说哪种最好。基本方法可能类似于vtable,但JIT编译器也会在运行时优化代码,因此某个方法甚至可能完全内联到调用代码中。但从高层次的角度来看,它应该始终表现为方法是虚拟的。 - biziclop
以下是有关该主题的更多阅读材料:https://dev59.com/eHI_5IYBdhLWcg3wJfkM - biziclop

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