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