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

Где хранятся переменные статического класса?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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