Я пришел из операционных систем и из области C, где мир прост, когда код компилируется. Необходимо разобраться и понять стек, текстовый раздел кучи и т. Д.

Когда я начал изучать Java (я знаю про JVM и сборщик мусора), меня позабавили статические методы. Насколько я понимаю, все экземпляры класса создаются в куче, а затем очищаются. Однако для статического метода экземпляр класса не нужен.

Итак, может ли кто-нибудь объяснить, чем нестатические методы и статические методы отличаются в модели памяти. Оба они находятся в текстовой части памяти. Или я все испортил.

Благодарность

2
agent.smith 23 Янв 2015 в 02:55

2 ответа

Лучший ответ

В Java байт-код для классов (включая их методы, как статические, так и экземпляры) является частью кучи (обычно в специальной секции «постоянной генерации» для долгоживущих объектов).

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

Однако для статического метода экземпляр класса не нужен.

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


А затем идет JIT-компиляция собственного кода: с помощью Hotspot байт-код для часто используемых методов компилируется в собственный машинный код. Результат этого попадает куда-то за пределы кучи в собственную память, и это происходит только для методов, которые действительно используются (статические или нет).

2
Thilo 23 Янв 2015 в 09:26

Как вы понимаете, все экземпляры класса создаются в куче ...

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

Статический класс или статические члены данных нестатического класса имеют одну копию в памяти.

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

0
DAC 23 Янв 2015 в 01:27