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



например:



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, в куче или в стеке памяти? Как они хранятся?

1299   8  

8 ответов:

статические методы (фактически все методы), а также статические переменные хранятся в PermGen раздел кучи, так как они являются частью данных отражения (связанных с классом данных, не связанных с экземпляром).

обновление для разъяснения:

обратите внимание, что в пространстве PermGen хранятся только переменные и их технические значения (примитивы или ссылки).

если ваша статическая переменная является ссылкой на объект, который сам объект хранится в обычных секциях кучи (молодое/старое поколение или оставшееся в живых пространство). Эти объекты (если они не являются внутренними объектами, такими как классы и т. д.) есть не хранится в пространстве PermGen.

пример:

static int i = 1; //the value 1 is stored in the permgen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the permgen section, the object itself is not.


Несколько слов о сборе мусора:

Do не полагаются на finalize() как это не гарантированно работать. Это полностью зависит от JVM, чтобы решить, когда запускать сборщик мусора и что собирать, даже если объект является elligible для сборки мусора.

конечно, вы можете установить статическую переменную в null и таким образом удалить ссылку на объект в куче, но это не означает сборщик мусора будет соберите его (даже если больше нет ссылок).

дополнительно finalize() запускается только один раз, поэтому вы должны убедиться, что он не создает исключений или иным образом не препятствует сбору объекта. Если вы остановите завершение через какое-то исключение, finalize() не будет вызываться тот же самый объект во второй раз.

Конечная нота: как код, выполнения данные, и т. д. хранятся зависит от JVM, который используется, т. е. HotSpot может сделать это по-другому, чем JRockit, и это может даже отличаться между версиями одного и того же JVM. Вышеизложенное основано на HotSpot для Java 5 и 6 (они в основном одинаковы), так как во время ответа я бы сказал, что большинство людей использовали эти JVMs. Из-за серьезных изменений в модели памяти с Java 8, вышеизложенное не может будьте верны для Java 8 HotSpot - и я не проверял изменения Java 7 HotSpot, поэтому я Угадай выше все еще верно для этой версии, но я не уверен здесь.

переменные класса(статические переменные) хранятся в составе Class object связанные с этим классом. Этот объект класса может быть создан только JVM и хранится в permanent generation.

также некоторые ответили, что он хранится в области памяти, которая называется Method Area. даже этот ответ не является неправильным. Это просто дискуссионная тема, является ли область Permgen частью кучи или нет. Очевидно, что восприятие отличается от человека к человеку. На мой взгляд, мы предоставляем пространство кучи и пространство permgen по-разному в аргументах JVM. Так что это хорошее предположение, чтобы относиться к ним по-другому.

другой способ увидеть это

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

enter image description here

Это вопрос с простым ответом и многословный ответ.

простой ответ-это куча. Классы и все данные, применяемые к классам (не данные экземпляра), хранятся в разделе постоянной генерации кучи.

длинный ответ уже на переполнение стека:

есть подробное описание памяти и сборки мусора в JVM и ответьте, что говорит более кратко о оно.

он хранится в куче, на которые ссылается определение класса. Если вы думаете об этом, это не имеет ничего общего со стеком, потому что нет никакой возможности.

в дополнение к ответу Томаса , статические переменные хранятся в области без кучи, которая называется Областью метода.

статические переменные хранятся в куче

поскольку статические переменные являются переменными уровня класса, они будут хранить " постоянный "память " кучи". Пожалуйста, посмотрите в этой для получения более подробной информации о JVM. Надеюсь, это будет полезно

до Java 8:

статические переменные были сохранены в пространстве permgen(также называемом областью метода).

пространство PermGen также известно как область метода

пространство PermGen используется для хранения 3 вещей

  1. данные уровня класса (метаданные)
  2. интернированы строки
  3. статические переменные

начиная с Java 8 и далее

статический переменные хранятся в самой куче.Начиная с Java 8 пространство PermGen было удалено и введено новое пространство, названное как MetaSpace, которое больше не является частью кучи, в отличие от предыдущего пространства Permgen. Мета-пространство присутствует в собственной памяти (память, предоставляемая ОС конкретному приложению для собственного использования), и теперь она хранит только метаданные класса.

интернированные строки и статические переменные перемещаются в саму кучу.

для официального информация см.:JEP 122: удалите постоянное пространство генов

Comments

    Ничего не найдено.