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

时间:2014-03-20 00:30:23

标签: java oop object memory

考虑这个课程:

public class Test {
    private int bar = 5;

    public void foo () {
        System.out.println("hi");
    }
}

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

Test obj1 = new Test();
Test obj2 = new Test();
Test obj3 = new Test();

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

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

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

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

3 个答案:

答案 0 :(得分:4)

  

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

没有

  

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

没有

  

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

是什么让你认为其他任何语言?这里真正的问题是为什么你认为每个实例都会实例化方法?有什么意义呢?

答案 1 :(得分:3)

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

负责处理基于类的方法的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/


其他参考文献

How the hava virtual machine handles method invocation and return

这是一个类似的SO问题: How much memory is used for function references in a Java object?

答案 2 :(得分:0)

更清楚的是,完全不需要不同的对象为其方法提供不同的代码。假设你有3个Test实例,你需要三个版本的'bar'成员,因为它们可以有不同的值。然而,所有三种'foo'方法都完全相同。代表代码的位完全相同。拥有三个(相同)版本将完全没有意义。

所有其他计算机语言也这样做。实际上你会发现,在计算机上,如果你同时在三个文件上执行(比方说)一个文本编辑器,那么将有三个数据区域代表三个文件,但是在内存中只有一个地方代表了应用程序的实际代码被储存了。这三个'实例'分享它。