Используют ли методы в экземплярах классов место в памяти?
Когда у меня есть класс вроде этого:
class Test {
private int _id = 0 ; // 4 bytes
private int _age = 0 ; // 4 bytes
}
Я уверен, что каждый экземпляр из него будет потреблять более 8 байтов в памяти из-за целых чисел.
Но как насчет методов? Если у меня есть класс с миллионом методов и 2 экземпляра его, будут ли методы занимать в два раза больше места в памяти?
Как это работает?
Спасибо.
Ответы
Ответ 1
Нет. Методы встречаются только один раз в памяти 1. Они не меняются в зависимости от каждого экземпляра, поэтому им не требуется хранение на основе каждого экземпляра.
Объект в Java в основном состоит из некоторого "домашнего хозяйства" фиксированного размера (указателя на информацию типа, включая vtable), потенциально связанных с GC битов (мыслить и прокручивать), информацию о мониторе для экземпляра и т.д. а затем поля.
1 Это немного упрощает. Могут быть различные представления, такие как байт-код, собственный код и т.д., Но это независимо от отдельных экземпляров.
Ответ 2
Наличие двух экземпляров одного и того же класса не дублирует объем пространства, необходимый для кода метода. То есть методы располагаются в одном месте в памяти, а затем каждый экземпляр класса имеет указатель, указывающий на это место в памяти. Это связано с тем, что в противном случае память будет потрачена впустую. Код, который должен быть выполнен для каждого метода, тот же, независимо от того, какой экземпляр класса вызывает его, поэтому нет смысла дублировать его.
Ответ 3
Но для выполнения таких методов, как instance.method(), локальная копия метода будет выполнена в стеке на экземпляр, где, поскольку экземпляр будет находиться в куче.