类实例中的方法是否在内存中占有一席之地?

时间:2011-08-02 08:47:25

标签: java

当我有这样的课时:

class Test {
    private int _id  = 0 ; // 4 bytes
    private int _age = 0 ; // 4 bytes
}

由于2个整数,我确信它的每个实例在内存中消耗的字节数超过8个字节。

但方法怎么样?如果我有一个拥有一百万个方法的类,以及它的两个实例,那么这些方法会占用内存的两倍吗?

它是如何运作的?

谢谢。

3 个答案:

答案 0 :(得分:20)

没有。方法仅在内存 1 中出现一次。它们不是基于每个实例变化,因此它们不需要基于每个实例存储

Java中的对象基本上由一些固定大小的“内务处理”(指向包含vtable的类型信息的指针),可能与GC相关的位(思考标记和扫描),有关实例的监视器的信息等组成 - 然后是田野。


1 这有点简化。可能有各种表示形式,例如字节码,本机代码等 - 但这与单独的实例无关。

答案 1 :(得分:7)

具有相同类的两个实例不会复制方法代码所需的空间量。也就是说,这些方法驻留在内存中的一个位置,然后该类的每个实例都有一个指向内存中该位置的指针。这是因为否则会浪费内存。无论类的哪个实例调用它,每个方法需要执行的代码都是相同的,因此复制它是没有意义的。

答案 2 :(得分:3)

但是为了执行像instance.method()这样的方法,该方法的本地副本将在每个实例的堆栈中进行,其中实例将在堆中。