Если мы храним объекты в статических полях объекта, как JVM выделяет для него память? Он живет в «неявном» (не уверен, что я использую правильное слово) объект класса? Как статические поля отличаются от полей объектов?Java: где статические поля живут внутри памяти?
ответ
Статические поля являются переменными класса и разделяются между всеми экземплярами этого класса. Переменные экземпляра (или поля объектов, на которые, как я думаю, вы ссылаетесь на них), принадлежат отдельным экземплярам класса и не используются совместно.
Что касается того, где они хранятся в памяти, это будет основано на реализации JVM, и нет причин, по которым потребуются два разных JVM для хранения их в одном месте по спецификации (насколько мне известно в наименее - следует вставить соответствующую ссылку на спецификацию здесь).
Как сказал NickLarsen, я не думаю, что существует какая-либо спецификация JVM, как точно хранятся статические поля. Компиляция определенных констант (статическая окончательная) заменит, скорее всего, выражение во время компиляции. Для переменных статических полей будет только два параметра: куча или (если имеется) сегмента данных JVM.
Как говорит Ник, нет конкретного «физического» местоположения, предусмотренного спецификацией языка, но с точки зрения логической ментальной модели, о которой вы можете рассуждать, это может помочь вам подумать о статических полях, связанных с объект класса (Foo.class
) класса, к которому принадлежат эти поля.
Как и в стороне, объект класса используется другими способами (что являются предусмотренными языка спецификации) при работе со статическими лицами: например, при вызове synchronized
статического метода, блокировка удерживаются на классе объект класса, к которому принадлежит этот метод.
Вы имеете в виду, что блокировка статических полей также блокирует объект класса? –
@ tm.sauron Вы не можете заблокировать поле, только объект, к которому относится поле (в этом случае только последний заблокирован). Если вы вызываете статический метод, который является «синхронизированным», он блокирует объект класса, так как статические методы не имеют ссылки «this». (Нестатические 'synchronized' методы блокируют' this', а не объект класса, после вызова.) –
Статические поля являются частью класса; предположительно, они исчезают, когда класс выгружается. Имеет смысл представить их как находящиеся где-то рядом с экземпляром Class
для класса. Подробная информация о том, как выкладывается память, недоступна для приложения Java; как следствие, спецификация JVM не требует ничего конкретного по этому вопросу. Даже «исчезновение» полей при разгрузке класса не может наблюдаться напрямую, а только посредством действия GC, предполагая хорошо установленный метод finalize()
.
Статические поля хранятся в объекте Class, который хранится в пространстве PemGen. Это часть памяти кучи.
- 1. Где живут Java-апплеты?
- 2. где объекты, статические и постоянные переменные живут в php?
- 3. Где внешние библиотеки живут в APK?
- 4. Где статические члены живут, если не на куче?
- 5. Где живут Android-константы?
- 6. Где интерфейсы «физически живут»?
- 7. Где методы «живут»?
- 8. Java статические поля
- 9. Как именно статические поля работают внутри?
- 10. Где таймеры живут в matplotlib
- 11. Макет объекта Java и статические поля
- 12. Где данные статического производства живут в рельсах?
- 13. Где хранятся статические переменные в java?
- 14. где в памяти хранятся статические переменные?
- 15. Java: статические поля переходных процессов
- 16. Как компилятор знает, где находятся статические поля?
- 17. Частные статические члены - использование памяти
- 18. Где живут методы? Стек или в куче?
- 19. ByteBuffer как статические конечные поля внутри классов
- 20. Где статические локальные переменные go
- 21. Где живут шаблоны для Java в Intellij-IDEA?
- 22. Статические поля Java, не работающие с наследованием
- 23. В Java, где хранятся примитивные статические переменные и статические функции?
- 24. статические поля getResource
- 25. Где статические конечные переменные, используемые в java?
- 26. Статические и нестатические поля
- 27. Где живут os_logs? Могут ли они разбираться?
- 28. Где живут хакеры Linux TCP/IP?
- 29. Данные ввода поля печати живут с Javascript
- 30. Зачем нужны поля в интерфейсах в java? Где мы используем эти статические конечные поля?
Статические поля инициализируются, когда первый вызов выполняется для закрывающего типа, и они доступны из любого экземпляра этого типа. –
Помните, что объекты, на которые ссылаются статические поля, являются просто обычными объектами, поэтому не имеет большого значения, как статические поля обрабатываются какой-либо конкретной реализацией. –