Где хранятся переменные статического класса?
Это следующий вопрос Как хранятся статические массивы в памяти Java?.
Таким образом, глобальные переменные в C/С++ хранятся в статическом сегменте данных памяти. Но что относительно статических переменных класса в Java/С++?
Это не может быть сегмент статических данных, потому что вы не знаете, что/сколько классов будут ссылаться на протяжении всей вашей программы (из-за отражения). Это определенно не стек, потому что это не имеет смысла. Хранение его в куче также является нечетким.
Ответы
Ответ 1
В Java, на низком уровне, статические переменные класса действительно хранятся в куче, наряду со всеми другими метаданными класса. Для Java они выглядят как глобальные, но для JVM низкоуровневых подпрограмм управления кучей - это динамические данные (хотя они могут быть обработаны немного специально для повышения эффективности GC, поскольку они, вероятно, будут долго жить). В конце концов, классы могут быть выгружены путем unreferencing их загрузчика классов.
Что касается того, является ли он таким же, как C malloc()
, маловероятным. Большинство JVM контролируют свои кучи на низком уровне; они хватают кучу памяти от ОС и разлагают ее сами. Таким образом, большинство данных Java, включая статические данные, не хранятся в куче malloc, а скорее в отдельной куче, управляемой JVM.
Ответ 2
Java имеет "постоянную" кучу, где она помещает метаданные класса. Таким образом, "корни" статических значений находятся в постоянной куче. Значения являются ссылочными значениями (объектами класса), сами значения находятся в обычной куче.
Ответ 3
Статические переменные не будут храниться в куче. Они являются частью сегмента данных.
Локальные переменные будут храниться в - Stack;
Переменные экземпляра будут сохранены в - Куче;
Переменные класса (Static) будут храниться в сегменте данных. Эти переменные будут совместно использоваться всеми объектами этого класса.
Ваш последний эквивалентный Java-код машины будет сохранен в сегменте кода/текста.