Ответ
Статические переменные хранятся в области памяти для метаданных классов. В зависимости от версии JVM эта область имеет разное название и расположение:
| Версия JVM | Область хранения | Расположение |
|---|---|---|
| Java 7 и ранее | Permanent Generation (PermGen) | Часть кучи (Heap) |
| Java 8 и новее | Metaspace | Нативная память ОС (вне кучи) |
Причина эволюции: Metaspace была введена для устранения ограничений PermGen (фиксированный размер, риск OutOfMemoryError: PermGen space) и обеспечения динамического управления памятью под метаданные классов.
Пример и пояснение:
class AppConfig {
static final String NAME = "MyApp"; // Значение "MyApp" (String pool) в куче.
// Ссылка NAME хранится в Metaspace.
static int userCount = 0; // Примитивное значение 0 хранится непосредственно в Metaspace.
}
Итог: Начиная с Java 8, статические переменные технически хранятся вне Java-кучи, в Metaspace, что делает их управление более эффективным и предотвращает связанные с PermGen ошибки памяти.