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

Например:

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

Ответы [ 8 ]

131 голосов
/ 05 декабря 2011

Статические методы (фактически все методы), а также статические переменные хранятся в разделе 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.


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

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

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

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

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

24 голосов
/ 27 декабря 2013

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

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

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

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

enter image description here

13 голосов
/ 05 декабря 2011

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

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

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

В JVM имеется подробное описание памяти и сборки мусора , а также ответ , который более кратко говорит об этом.

11 голосов
/ 06 августа 2018

До Java 8:

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

Также доступно пространство PermGenизвестный как Область Метода

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

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

Начиная с Java 8

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

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

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

9 голосов
/ 05 декабря 2011

Хранится в куче, на которую ссылается определение класса.Если вы думаете об этом, это не имеет никакого отношения к стеку, потому что нет области.

5 голосов
/ 16 ноября 2013

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

4 голосов
/ 17 августа 2015

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

3 голосов
/ 05 декабря 2011

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

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