Каково реальное место в памяти для статических переменных? - PullRequest
26 голосов
/ 04 июля 2011

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

Ответы [ 6 ]

32 голосов
/ 13 апреля 2012

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

  1. Сегмент стека & mdash; содержит локальные переменные и справочные переменные (переменные, которые содержат адрес объекта в куче).

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

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

19 голосов
/ 04 июля 2011

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

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

* 1004Способ реализации может зависеть от JVM, но JVM Sun / Oracle создает «объект» для хранения статических полей для класса.Этот объект доступен через класс Unsafe, который также можно использовать для проверки полей «объекты».
8 голосов
/ 04 июля 2011

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

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

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

1 голос
/ 06 февраля 2017

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

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

1 голос
/ 04 июля 2011

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

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

0 голосов
/ 01 июля 2019

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

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