Статический метод выделения памяти

#java #static #static-methods #static-members

#java #статический #статические методы #статические члены

Вопрос:

У нас есть две классификации heap и stack . При создании объекта память для объекта сохраняется в куче. Что делать, если в классе есть статические методы, которые можно вызвать, используя имя класса. Если объект не создан, то как он будет выделять память, и если да, то где он будет выделять память?

Комментарии:

1. И для чего предназначена эта выделенная память?

2. Из его комментария ниже ясно, что это Java, поэтому я добавил тег Java.

Ответ №1:

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

Единственное отличие статического «объекта» в том, что вы не можете получить ссылку на него. (Но вы можете использовать отражение для доступа к полям)

Ответ №2:

Методы (т. Е. Код) Не хранятся в объекте; все объекты класса будут совместно использовать код для метода. Независимо от языка (Java, C или практически любого другого) для любого метода, статического или нет, будет существовать только одна копия кода. Обычно существует определенная область памяти, то есть сегмент КОДА на родном языке, таком как C , или специальная область кучи в Java, куда загружается код.

Комментарии:

1. Хорошо, память для объектов создается вместе с классом. т.е. в куче (java) создается только память для класса, только когда мы используем оператор new, мы можем создать память. Но для таких классов, как Math, мы не можем создавать экземпляры .. в таком случае, где создается память?

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

3. @user980918 java.lang. Математике не требуется много памяти во время выполнения — единственная часть, о которой я могу думать, — это статическая переменная, которая содержит Random объект. Статические переменные для класса хранятся в куче вместе с Class объектом. (Локальные переменные в методах находятся в стеке, независимо от статичности метода.)

Ответ №3:

  • Пространство постоянной генерации (PermGen) кучи содержит постоянные метаданные класса и информацию о дескрипторах.

  • Постоянное пространство всегда зарезервировано для классов и тех, которые привязаны к классам (статические члены, статические функции и т. Д.)

  • Статическая функция принадлежит классу, поэтому ее можно вызывать без создания объекта класса.