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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

enter image description here

Ответ 3

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

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

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

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

Ответ 4

До Java 8:

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

Пространство PermGen также известно как Область Метода

В PermGen Space хранятся 3 вещи

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

Начиная с Java 8

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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