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

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

Ответ

Статические поля (переменные класса) хранятся в области памяти, предназначенной для метаданных класса. В спецификации JVM эта область называется Method Area. В современных реализациях (HotSpot JVM) она является частью Metaspace (или ранее PermGen).

Почему именно там? Статические поля принадлежат самому классу, а не его экземплярам. Они инициализируются при загрузке класса и существуют на протяжении всего времени жизни загрузчика классов (ClassLoader).

Пример:

public class Counter {
    // Это статическое поле будет храниться в Method Area/Metaspace
    public static int instanceCount = 0;
    private int id;

    public Counter() {
        id = ++instanceCount; // Все экземпляры используют одно общее поле
    }
}
// Доступ без создания объекта:
Counter.instanceCount = 10;

Ключевые особенности:

  • Единственность: Одно поле на класс, общее для всех его экземпляров.
  • Время жизни: Создается при инициализации класса и уничтожается при выгрузке класса сборщиком мусора (когда загрузчик классов становится недостижимым).
  • Потокобезопасность: Доступ не синхронизирован по умолчанию. При работе из нескольких потоков требуется явная синхронизация или использование атомарных классов (AtomicInteger).