Если мы храним объекты в статических полях объекта, как JVM выделяет память для него? Это живет в "неявном" (не уверенный, если я использую правильное слово), объект класса? Как статические поля отличаются от полей объекта?
Статические поля являются переменными класса, и передаются среди всех экземпляров этого класса. Переменные экземпляра (или поля объектов, как я думаю, вы относитесь к ним как) принадлежат к отдельным случаям класса и не передаются.
Как и в том, где они хранятся в памяти, собирается основываться на реализации JVM, и нет никаких причин, чтобы два разных JVM не потребуются хранить их в том же месте по спецификации (к лучшему из моих знаний, по крайней мере, - Должен вставить соответствующую спецификацию ссылки здесь).
Статические поля являются частью класса; Предположительно, они исчезают, когда класс не загружен. Имеет смысл представить их как где-то рядом с экземпляром класса
для класса. Подробности о том, как проложено память, выходит за пределы досягаемости приложения Java; В качестве следствия спецификация JVM не соответствует ничего особенным на эту тему. Даже «исчезновение» полей, когда класс не загружен, не может наблюдаться непосредственно, но только через действие GC, предполагая, что у хорошо размещенного доработка ()
.
Как сказал никларенн, я не думаю, что есть какие-либо спецификации JVM, как именно статические поля хранятся. Компилированные определенные константы (статические окончательные) заменит наиболее вероятность выражения во время компиляции. Для переменных статических полей будет только два варианта: куча или (если существуют) сегмент данных JVM.
Как говорит ответ Ника, нет конкретного «физического» места, предусмотренного спецификацией языка, но с точки зрения логической ментальной модели, о которой вы можете рассуждать, это может помочь вам подумать о статических полях, которые прикреплены к Класс объекта ( Foo.class
) класса эти поля принадлежат.
Кроме того, объект класса используется другими способами (что - , предусмотренные языком SPEC) при работе со статическими объектами: например, при вызове синхронизированных
Способ, замок удерживается на объекте класса класса, к которому принадлежит метод метода.