Каков порядок запуска Java-программы в JVM?

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

Ответ

Запуск программы — это многоэтапный процесс, управляемый JVM (Java Virtual Machine).

Основные этапы:

  1. Загрузка класса (Loading): ClassLoader находит и загружает байт-код класса, указанного в команде запуска (класс с методом main).
  2. Связывание (Linking):
    • Проверка (Verification): JVM проверяет корректность и безопасность байт-кода.
    • Подготовка (Preparation): Выделяется память под статические переменные класса и им присваиваются значения по умолчанию (например, 0, null).
    • Разрешение (Resolution): Символические ссылки на другие классы преобразуются в прямые ссылки.
  3. Инициализация (Initialization): Выполняются:
    • Статические блоки инициализации (static {}).
    • Инициализаторы статических переменных (присваивание явных значений).
    • Этот этап гарантирует выполнение перед первым активным использованием класса.
  4. Выполнение (Execution):
    • JVM создает основной поток (main thread).
    • В этом потоке вызывается метод main(String[] args).

Пример, демонстрирующий порядок:

public class StartupDemo {
    static String staticField = initStaticField(); // (3)

    static { // (2)
        System.out.println("Static block 1");
    }

    static { // (1)
        System.out.println("Static block 2");
    }

    static String initStaticField() {
        System.out.println("Static field initialization");
        return "value";
    }

    public static void main(String[] args) { // (4)
        System.out.println("Main method executed");
    }
}

Вывод программы:

Static field initialization
Static block 1
Static block 2
Main method executed

Оптимизация во время выполнения: Современные JVM (HotSpot) используют JIT-компиляцию (Just-In-Time). Часто исполняемые участки байт-кода («горячие» методы) компилируются в нативный машинный код для значительного ускорения.