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



当我有这样一个类:

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

我确信它的每个实例将消耗超过8字节的内存,因为这两个整数。

但是方法呢?如果我有一个类有一百万个方法,它的两个实例,这些方法会占用两倍的内存空间吗?

它是如何工作的?

谢谢。

No。方法在内存1中只出现一次。它们的不会在每个实例的基础上改变,所以它们不需要在每个实例的基础上存储

Java中的对象基本上由一些固定大小的"内务管理"(一个指向类型信息的指针,包括虚值表)、可能与gc相关的位(想想标记和清除)、关于实例监视器的信息等组成,然后是字段。


1这是一个简化。可能有各种表示,如字节码、本机代码等,但这与单独的实例无关。

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

但是要执行像instance.method()这样的方法,方法的本地副本将在每个实例的堆栈中创建,而实例将在堆中。

最新更新