Где статические переменные класса хранятся в памяти? - PullRequest
11 голосов
/ 11 июля 2011

Это дополнительный вопрос к Как статические массивы хранятся в памяти Java? .

Таким образом, глобальные переменные в C / C ++ хранятся в сегменте статических данных памяти. Но как насчет статических переменных класса в Java / C ++?

Это не может быть сегмент статических данных, потому что вы не знаете, на какие / на какие классы будут ссылаться в течение всей вашей программы (из-за размышлений). Это определенно не стек, потому что это не имеет смысла. Хранить его в куче тоже нелепо.

Ответы [ 3 ]

5 голосов
/ 11 июля 2011

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

Что касается того, является ли он тем же самым, что и C malloc(), маловероятно.Большинство JVM контролируют свои кучи на низком уровне;они забирают часть памяти из ОС и разделяют ее сами.Таким образом, большинство данных Java, включая статические, хранятся не в куче malloc, а в отдельной куче, управляемой JVM.

3 голосов
/ 11 июля 2011

У Java есть «постоянная» куча, куда она помещает метаданные класса.Таким образом, «корни» статических значений находятся в постоянной куче.Значения являются ссылочными значениями (объектами классов), а сами значения находятся в обычной куче.

1 голос
/ 17 сентября 2012

Статические переменные не будут храниться в куче. Они являются частью сегмента данных. Локальные переменные будут храниться в - Stack; Переменные экземпляра будут храниться в - Heap; Переменные класса (Static) будут храниться в - Сегменте данных. Эти переменные будут общими для всех объектов этого класса. Ваш окончательный машинный эквивалент Java-кода будет сохранен в - Сегмент кода / текста.

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