Я пришел из операционных систем и из области C, где мир прост, когда код компилируется. Необходимо разобраться и понять стек, текстовый раздел кучи и т. Д.
Когда я начал изучать Java (я знаю про JVM и сборщик мусора), меня позабавили статические методы. Насколько я понимаю, все экземпляры класса создаются в куче, а затем очищаются. Однако для статического метода экземпляр класса не нужен.
Итак, может ли кто-нибудь объяснить, чем нестатические методы и статические методы отличаются в модели памяти. Оба они находятся в текстовой части памяти. Или я все испортил.
Благодарность
2 ответа
В Java байт-код для классов (включая их методы, как статические, так и экземпляры) является частью кучи (обычно в специальной секции «постоянной генерации» для долгоживущих объектов).
Классы также могут быть собраны в мусор, но обычно это происходит нечасто (только когда класс был загружен из несистемного загрузчика классов, и весь этот загрузчик классов устарел, например, когда веб-приложение выгружается).
Однако для статического метода экземпляр класса не нужен.
Правильно. Но все методы являются частью определения класса и загружаются вместе при загрузке класса. Даже если вы никогда не создадите экземпляр класса, код для всех методов экземпляра будет загружен в память кучи.
А затем идет JIT-компиляция собственного кода: с помощью Hotspot байт-код для часто используемых методов компилируется в собственный машинный код. Результат этого попадает куда-то за пределы кучи в собственную память, и это происходит только для методов, которые действительно используются (статические или нет).
Как вы понимаете, все экземпляры класса создаются в куче ...
Не совсем правильно, все классы компилируются в байтовый код объекта, иначе JVM нечего будет выполнять. Экземплярные и статические методы генерируют один и тот же байтовый код объекта. Даже нестатические классы генерируют только одну версию своего объектного байтового кода. Все классы экземпляров имеют свой собственный указатель на то, где их выполнение в этой единственной копии байтового кода. Настоящая разница заключается в членах данных класса. Каждый экземпляр нестатического класса должен иметь свою собственную копию всех нестатических членов данных (переменных), но статические члены данных имеют только одну копию в памяти, поскольку статические члены данных класса являются общими для всех экземпляров класса этот класс статический или нестатический.
Статический класс или статические члены данных нестатического класса имеют одну копию в памяти.
Нестатический класс по-прежнему имеет только одну копию своего объектного кода в памяти, только нестатические данные получают копию в памяти для каждого экземпляра.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.