Что происходит в памяти при выполнении оператора new в Java?

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

Ответ

Оператор new инициирует процесс создания нового объекта в куче (heap) и возвращает ссылку на него.

Последовательность шагов:

  1. Проверка класса: Загрузчик классов (ClassLoader) проверяет, загружен ли класс. Если нет — он загружается, связывается и инициализируется (выполняются статические блоки).
  2. Выделение памяти: В куче выделяется непрерывный блок памяти, достаточный для хранения всех полей объекта (включая поля родительских классов) и служебной информации (заголовок объекта).
  3. Инициализация полей по умолчанию: Все поля инициализируются значениями по умолчанию (0, false, null).
  4. Выполнение инициализаторов и конструкторов:
    • Выполняются инициализаторы полей и блоки инициализации экземпляра в порядке их объявления.
    • Вызывается конструктор класса. Если в конструкторе есть this(...) или super(...), управление передаётся им. Цепочка конструкторов выполняется до Object.
  5. Возврат ссылки: После успешного выполнения конструктора в переменную, указанную слева от =, присваивается ссылка на созданный объект.

Пример в деталях:

class Person {
    private String name = "Unknown"; // Инициализатор поля
    { System.out.println("Initialization block"); } // Блок инициализации

    public Person(String n) {
        this.name = n; // Конструктор
    }
}

Person p = new Person("Alice");

Что происходит:

  1. Выделяется память под Person (включая поле name).
  2. Поле name получает значение null (по умолчанию).
  3. name инициализируется как "Unknown".
  4. Выполняется блок инициализации (печать).
  5. Вызывается конструктор Person("Alice"), который присваивает полю name значение "Alice".
  6. Ссылка на объект присваивается переменной p.

Возможные ошибки:

  • OutOfMemoryError — если в куче нет достаточного непрерывного свободного места.
  • Исключение в конструкторе — объект считается несозданным, но память может быть собрана сборщиком мусора.