java对象在内存中共享方法位置吗?

use*_*482 6 java memory oop object

考虑这个课程:

public class Test {
    private int bar = 5;

    public void foo () {
        System.out.println("hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在假设我们有以下代码段执行:

Test obj1 = new Test();
Test obj2 = new Test();
Test obj3 = new Test();
Run Code Online (Sandbox Code Playgroud)

所有三个对象都存在于同一范围内.因为bar不是静态的,所以内存中会有三个独立的bar实例.

  1. 在内存中有foo方法的三个实例吗?

  2. JVM是否做了一些魔术,以便每个对象可以在内存中使用一个方法声明?

  3. 是否有这种情况的名称,以便我可以看到其他语言是否这样做?

ılǝ*_*ılǝ 4

方法通过索引引用,没有方法的实例,即它们不占用额外的内存。

负责处理基于类的方法的 Java 指令集是invokevirtual

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.invokevirtual

以下是对幕后发生的情况的更详细了解(比我能解释得更好):

http://zeroturnaround.com/rebellabs/java-bytecode-fundamentals-using-objects-and-calling-methods/


其他参考资料

hava虚拟机如何处理方法调用和返回

这是一个类似的问题: How much memory is using for function引用在Java对象中?