Ответ
Статические члены класса (переменные и методы) хранятся в области памяти, предназначенной для метаданных классов, которая в разных версиях JVM называется по-разному:
- До Java 8: Permanent Generation (PermGen) — часть кучи (Heap).
- Начиная с Java 8: Metaspace — выделяется из нативной памяти (вне кучи) операционной системы.
Ключевые характеристики:
- Загружаются в память при первой инициализации класса ClassLoader'ом.
- Существуют на протяжении всего времени работы JVM (или до выгрузки класса).
- Общие для всех экземпляров класса.
Пример:
class Counter {
static int count = 0; // Статическая переменная хранится в Metaspace.
static void increment() { // Байт-код статического метода также в Metaspace.
count++;
}
}
// Использование без создания экземпляра:
Counter.increment();
System.out.println(Counter.count);
Важно: Сами статические методы (их байт-код) и структура класса также хранятся в этой области. Статические переменные, являющиеся ссылками, хранят саму ссылку в Metaspace, а объект, на который она указывает, — в обычной куче.