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