2010-01-26 3 views
14

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

+0

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

+0

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

ответ

12

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

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

0

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

5

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

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

+0

Вы имеете в виду, что блокировка статических полей также блокирует объект класса? –

+1

@ tm.sauron Вы не можете заблокировать поле, только объект, к которому относится поле (в этом случае только последний заблокирован). Если вы вызываете статический метод, который является «синхронизированным», он блокирует объект класса, так как статические методы не имеют ссылки «this». (Нестатические 'synchronized' методы блокируют' this', а не объект класса, после вызова.) –

0

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

0

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

Смежные вопросы