Подтвердить что ты не робот

Используют ли методы в экземплярах классов место в памяти?

Когда у меня есть класс вроде этого:

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

Я уверен, что каждый экземпляр из него будет потреблять более 8 байтов в памяти из-за целых чисел.

Но как насчет методов? Если у меня есть класс с миллионом методов и 2 экземпляра его, будут ли методы занимать в два раза больше места в памяти?

Как это работает?

Спасибо.

4b9b3361

Ответ 1

Нет. Методы встречаются только один раз в памяти 1. Они не меняются в зависимости от каждого экземпляра, поэтому им не требуется хранение на основе каждого экземпляра.

Объект в Java в основном состоит из некоторого "домашнего хозяйства" фиксированного размера (указателя на информацию типа, включая vtable), потенциально связанных с GC битов (мыслить и прокручивать), информацию о мониторе для экземпляра и т.д. а затем поля.


1 Это немного упрощает. Могут быть различные представления, такие как байт-код, собственный код и т.д., Но это независимо от отдельных экземпляров.

Ответ 2

Наличие двух экземпляров одного и того же класса не дублирует объем пространства, необходимый для кода метода. То есть методы располагаются в одном месте в памяти, а затем каждый экземпляр класса имеет указатель, указывающий на это место в памяти. Это связано с тем, что в противном случае память будет потрачена впустую. Код, который должен быть выполнен для каждого метода, тот же, независимо от того, какой экземпляр класса вызывает его, поэтому нет смысла дублировать его.

Ответ 3

Но для выполнения таких методов, как instance.method(), локальная копия метода будет выполнена в стеке на экземпляр, где, поскольку экземпляр будет находиться в куче.