Где хранятся статические поля класса в Java?

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

Ответ

Статические поля (переменные класса) хранятся в метапространстве (Metaspace), начиная с Java 8. До Java 8 они размещались в Permanent Generation (PermGen).

Пример:

class MyClass {
    // Статическая переменная хранится в Metaspace.
    static int instanceCount = 0;
}

Особенности и почему Metaspace:

  1. Время жизни: Существуют на протяжении всей работы приложения, загружаются при инициализации класса.
  2. Общность: Единственная копия поля является общей для всех экземпляров класса.
  3. Управление памятью: Metaspace динамически выделяется из native-памяти ОС (в отличие от фиксированного PermGen), что помогает избежать OutOfMemoryError: PermGen space.
  4. Сборка мусора: Может быть очищена сборщиком мусора, если загрузчик классов (ClassLoader) и сам класс становятся недостижимыми.