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

Каково фактическое место памяти для статических переменных?

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

4b9b3361

Ответ 1

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

Для таких приложений, как OSGi, статические переменные не живут в течение всего срока службы приложения, могут многократно перезагружаться.

Как это реализовать, может быть зависимо от JVM, но JVM Sun/Oracle создает "объект" для хранения статических полей для класса. Этот объект доступен через класс Unsafe, который также можно использовать для изучения этих полей "объектов".

Ответ 2

В нашей памяти есть 3 сегмента:

  • Сегмент стека — содержит локальные переменные и ссылочные переменные (переменные, которые хранят адрес объекта в куче).

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

  • Сегмент кода — сегмент, где фактические скомпилированные байт-коды Java сохраняются при загрузке. Статические члены (переменные или методы) называются членами класса, то есть они находятся там, где находится класс (байт-код), который находится в сегменте кода.

Ответ 3

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

Фактически, статические кадры (т.е. фреймы, которые содержат статические переменные), выделены из кучи.

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

Ответ 4

Из http://www.daniweb.com/software-development/java/threads/34695:

Сохраняется статическая переменная памяти в начале программы, в регулярная память вместо стека (выделенная память специально для программа). преимущество этого что он делает вашу переменную или процедура полностью постоянна, и вы не может случайно изменить значение. недостатком этого является то, что память не освобождается до программа прекращается. я никогда слышал все, что принимает статические значения больше, чем если бы они были объявляется регулярно, но их память использование является постоянным. t/.

Ответ 5

Из пяти областей памяти, которые использует JVM, статическим полям присваивается память в области класса (часть PremGen), когда класс загружается загрузчиком класса Application во время фазы подготовки и загрузки. Если поле является примитивным, значение сохраняется в области класса, и если оно относится к типу объекта (используется новый оператор), оно хранится в куче, но ссылка присваивается назначенной переменной статического поля в области класса. Когда класс выгружается, память для этого статического поля также доступна для сбора мусора, собранного GC.

Если поле является окончательным, то есть статическим окончательным, оно сохраняется в постоянном пуле в области класса.

Ответ 6

Статические переменные предоставляются памяти в том же сегменте памяти, где хранится код, т.е. в области классов. Он не зависит от стека или сегмента кучи памяти. Он остается доступным в течение всего срока действия программы.