Например:
class A {
static int i=0;
static int j;
static void method() {
// static k=0; can't use static for local variables only final is permitted
// static int L;
}
}
Где эти переменные будут храниться в Java, в куче или в стековой памяти? Как они хранятся?
Ответы:
Статические методы (фактически все методы), а также статические переменные хранятся в
PermGen
разделе кучи, поскольку они являются частью данных отражения (данные, относящиеся к классу, а не к экземплярам).Обновление для уточнения :
Обратите внимание, что в пространстве PermGen хранятся только переменные и их технические значения (примитивы или ссылки).
Если ваша статическая переменная является ссылкой на объект, сам объект хранится в обычных разделах кучи (молодое / старое поколение или пространство оставшихся в живых). Эти объекты (если они не являются внутренними объектами, такими как классы и т. Д.) Не хранятся в пространстве PermGen.
Пример:
Несколько слов о сборке мусора:
Вы не полагаться на ,
finalize()
как это не гарантированно работать. JVM полностью решает, когда запускать сборщик мусора и что собирать, даже если объект подходит для сборки мусора.Конечно, вы можете установить для статической переменной значение null и таким образом удалить ссылку на объект в куче, но это не означает, что сборщик мусора будет собирать его (даже если ссылок больше нет).
Кроме того
finalize()
, запускается только один раз, поэтому вы должны убедиться, что он не вызывает исключений или иным образом не препятствует сбору объекта. Если вы остановите финализацию через какое-то исключение,finalize()
не будет вызван для того же объекта второй раз.Последнее замечание : способ хранения кода, данных времени выполнения и т. Д. Зависит от используемой JVM, т.е. HotSpot может делать это иначе, чем JRockit, и это может даже отличаться между версиями одной и той же JVM. Вышеупомянутое основано на HotSpot для Java 5 и 6 (они в основном одинаковы), поскольку на момент ответа я бы сказал, что большинство людей использовали эти JVM. Из-за значительных изменений в модели памяти, начиная с Java 8, приведенные выше утверждения могут быть неверными для Java 8 HotSpot - и я не проверял изменения Java 7 HotSpot, поэтому я предполагаю, что вышесказанное по-прежнему верно для этой версии, но я здесь не уверен.
источник
Переменные класса (статические переменные) хранятся как часть
Class object
связанных с этим классом. Этот объект класса может быть создан только JVM и хранится вpermanent generation
.Также некоторые ответили, что он хранится в области без кучи, которая называется.
Method Area.
Даже этот ответ не является неправильным. Является ли Пермский участок частью кучи - это спорный вопрос. Очевидно, что восприятие различается от человека к человеку. На мой взгляд, мы по-разному предоставляем пространство кучи и пространство для перманента в аргументах JVM. Так что относиться к ним по-другому - хорошее предположение.Другой способ увидеть это
Пулы памяти создаются менеджерами памяти JVM во время выполнения. Пул памяти может принадлежать памяти кучи или не кучи. Пул констант времени выполнения - это представление времени выполнения для каждого класса или интерфейса таблицы constant_pool в файле класса. Каждый пул констант времени выполнения выделяется из области методов виртуальной машины Java, а статические переменные хранятся в этой области методов. Кроме того, эта не-куча является не чем иным, как перманентной областью. Фактически, это часть перманентной области. ( Ссылка )
источник
Also this non-heap is nothing but perm gen area.Actually Method area is part of perm gen.
До Java 8:
Статические переменные хранились в перманентном пространстве (также называемом областью метода).
PermGen Space также известен как Область метода
PermGen Space использовался для хранения 3 вещей
Начиная с Java 8
Статические переменные хранятся в самой куче. Начиная с Java 8 пространство PermGen было удалено и введено новое пространство с именем MetaSpace, которое больше не является частью кучи, в отличие от предыдущего пространства Permgen. Мета-пространство присутствует в собственной памяти (память, предоставляемая ОС конкретному приложению для собственного использования), и теперь в нем хранятся только метаданные класса.
Интернированные строки и статические переменные перемещаются в саму кучу.
Официальная информация: JEP 122: Удалить постоянное пространство генерации.
источник
Это вопрос с простым ответом и развернутым ответом.
Ответ простой - куча. Классы и все данные, применяемые к классам (не данные экземпляра), хранятся в разделе постоянной генерации кучи.
Длинный ответ уже о переполнении стека:
Существует подробное описание памяти и сборки мусора в JVM, а также ответ, который говорит об этом более кратко .
источник
Он хранится в куче, на которую ссылается определение класса. Если подумать, это не имеет ничего общего со стеком, потому что у него нет области видимости.
источник
В дополнение к ответу Томаса статические переменные хранятся в области без кучи, которая называется областью метода.
источник
Поскольку статические переменные являются переменными уровня класса, они будут хранить « постоянную генерацию » памяти кучи. Пожалуйста, ознакомьтесь с этим, чтобы узнать больше о JVM. Надеюсь, это будет полезно
источник
статические переменные хранятся в куче
источник