Java: где статические поля живут в памяти? - PullRequest
17 голосов
/ 26 января 2010

Если мы храним объекты в статических полях объекта, как JVM выделяет для него память? Он живет внутри «неявного» (не уверен, правильно ли я использую слово) объекта класса? Чем статические поля отличаются от полей объекта?

Ответы [ 5 ]

13 голосов
/ 26 января 2010

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

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

6 голосов
/ 26 января 2010

Как сказано в ответе Ника, в спецификации языка не существует конкретного «физического» местоположения, но с точки зрения логической ментальной модели, о которой вы можете подумать, она может помочь вам представить статические поля как прикрепленные объект класса (Foo.class) класса, к которому принадлежат эти поля.

Кроме того, объект класса используется другими способами (которые предусмотрены в спецификации языка) при работе со статическими сущностями: например, при вызове статического метода synchronized блокировка содержится в объекте класса класса, к которому принадлежит метод.

1 голос
/ 26 января 2010

Статические поля являются частью класса; предположительно, они исчезают, когда класс выгружается. Имеет смысл представить их как нечто близкое к экземпляру Class для класса. Детали того, как распределяется память, недоступны Java-приложению; Как следствие, спецификация JVM не требует ничего конкретного по этому вопросу. Даже «исчезновение» полей, когда класс выгружен, не может наблюдаться напрямую, но только посредством действия GC, при условии правильного метода finalize().

0 голосов
/ 03 ноября 2013

Статические поля хранятся в объекте Class, который хранится в пространстве PemGen. Это часть кучи памяти.

0 голосов
/ 26 января 2010

Как сказал Ник Ларсен, я не думаю, что есть какая-либо спецификация JVM, как именно хранятся статические поля. Определенные константы компиляции (static final), скорее всего, заменят выражение во время компиляции. Для переменных статических полей будет только две опции: куча или (если есть) сегмент данных JVM.

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