Статичні методи (фактично всі методи), а також статичні змінні зберігаються у 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()
як це не гарантовано працювати. Спільне вирішення питання про те, коли запустити сміттєзбірник і що збирати, залежить, навіть якщо об'єкт має право на вивезення сміття.
Звичайно , ви можете встановити змінну статичного в нуль і , таким чином , видалити посилання на об'єкт в купі , але це не означає , що збирач сміття буде збирати його (навіть якщо немає більше посилань).
Додатково finalize()
запускається лише один раз, тому ви повинні переконатися, що він не викидає винятки або іншим чином перешкоджає збиранню об'єкта. Якщо ви зупините фіналізацію через якийсь виняток, finalize()
вдруге не буде викликано один і той же об’єкт.
Остаточне зауваження : як зберігаються код, дані часу виконання тощо, залежить від використовуваного JVM, тобто HotSpot може робити це інакше, ніж JRockit, і це може відрізнятися між версіями одного JVM. Вищенаведене базується на HotSpot для Java 5 та 6 (вони в основному однакові), оскільки під час відповіді я б сказав, що більшість людей використовували ці JVM. Зважаючи на значні зміни в моделі пам'яті, що стосується Java 8, наведені вище твердження можуть бути неправдивими для Java 8 HotSpot - і я не перевіряв зміни Java 7 HotSpot, тому, мабуть, вищезазначене все-таки справедливо для цієї версії, але я тут не впевнений.