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

Java: где статические поля живут в памяти?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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