В какой области памяти JVM хранятся статические переменные?

«В какой области памяти JVM хранятся статические переменные?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Статические переменные хранятся в области памяти для метаданных классов. В зависимости от версии 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 ошибки памяти.