当我有这样的课时:
class Test {
private int _id = 0 ; // 4 bytes
private int _age = 0 ; // 4 bytes
}
由于2个整数,我确信它的每个实例在内存中消耗的字节数超过8个字节。
但方法怎么样?如果我有一个拥有一百万个方法的类,以及它的两个实例,那么这些方法会占用内存的两倍吗?
它是如何运作的?
谢谢。
答案 0 :(得分:20)
没有。方法仅在内存 1 中出现一次。它们不是基于每个实例变化,因此它们不需要基于每个实例存储。
Java中的对象基本上由一些固定大小的“内务处理”(指向包含vtable的类型信息的指针),可能与GC相关的位(思考标记和扫描),有关实例的监视器的信息等组成 - 然后是田野。
1 这有点简化。可能有各种表示形式,例如字节码,本机代码等 - 但这与单独的实例无关。
答案 1 :(得分:7)
具有相同类的两个实例不会复制方法代码所需的空间量。也就是说,这些方法驻留在内存中的一个位置,然后该类的每个实例都有一个指向内存中该位置的指针。这是因为否则会浪费内存。无论类的哪个实例调用它,每个方法需要执行的代码都是相同的,因此复制它是没有意义的。
答案 2 :(得分:3)
但是为了执行像instance.method()这样的方法,该方法的本地副本将在每个实例的堆栈中进行,其中实例将在堆中。