офлайн
офлайн
ГлавнаяПлатформа Java и JVM.md
---
tags: [java, jvm]
created: 2026-11-05
updated: 
---

Платформа Java и JVM

Javajavajvm3 мин
Содержание

Usefull:

› Базовая триада

  •   JVM (Java Virtual Machine): Виртуальная машина, исполняющая байткод. Сама JVM платформозависима (разная для Windows, Linux и т.д.), но обеспечивает принцип WORA (Write Once, Run Anywhere) для Java-кода.
  •   JRE (Java Runtime Environment): Среда выполнения.      *   JRE = JVM + Core Libraries (базовые классы).      *   Примечание: С Java 11 не выпускается отдельно, кастомный JRE собирается утилитой jlink.
  •   JDK (Java Development Kit): Набор инструментов разработчика.      *   JDK = JRE + Development Tools (компилятор javac, отладчик, профилировщики).

› Жизненный цикл Java-кода

  1. Написание: Создание исходного кода приложения в файлах (.java).
  2. Статическая компиляция (Front-end): Утилита javac проверяет синтаксис и компилирует исходный код в платформонезависимый байт-код (.class).
  3. Загрузка и верификация (ClassLoader Subsystem):
    • Loading (Загрузка): ClassLoader считывает байты из .class файлов и размещает метаданные классов в области памяти (Method Area / Metaspace).
    • Verification (Верификация): Байт-код проходит строгую проверку безопасности на соответствие спецификации JVM (контроль типов, проверка переполнения стека, отсутствие прямого доступа к чужой памяти).
  4. Исполнение и динамическая оптимизация (Execution Engine / Back-end):
    • Execution (Интерпретация): Интерпретатор JVM построчно считывает байт-код и преобразует его в машинные команды конкретной ОС для быстрого старта программы.
    • Optimization (JIT-компиляция): Во время работы (runtime) JIT-компилятор (Just-In-Time) выявляет наиболее часто выполняемые участки кода («горячие точки» / Hotspots), компилирует их напрямую в оптимизированный машинный код процессора и сохраняет в памяти для максимальной скорости исполнения.

› Архитектура JVM

A. Classloader Subsystem (Подсистема загрузки)

Отвечает за загрузку, связывание и инициализацию классов.

  •   Иерархия (Delegation Model):     1.  Bootstrap Classloader: Базовые классы (java.base). Написан на C/C++.     2.  Platform Classloader: Классы расширений платформы.     3.  Application Classloader: Классы приложения (из classpath).
  •   Принцип делегирования: Загрузчик всегда сначала делегирует загрузку класса своему родителю. Это защищает базовые классы (например, java.lang.String) от подмены.

B. Runtime Data Areas (Области памяти)

  •   Общие для всех потоков (Shared):     *   Method Area (Metaspace): Метаданные классов, статические переменные, пул констант.     *   Heap (Куча): Все созданные объекты (new). Здесь работает Garbage Collector.
  •   У каждого потока свои (Thread-local):     *   Stack (Стек): Локальные переменные (примитивы и ссылки) и фреймы вызовов методов.     *   PC Register: Адрес текущей выполняемой инструкции.     *   Native Method Stack: Стек для вызова методов на других языках (C/C++) через JNI.

C. Execution Engine (Механизм выполнения)

  •   Interpreter (Интерпретатор): Построчно читает байткод и переводит в машинный код. Плюс: быстрый старт. Минус: медленное выполнение (нет кэширования).
  •   JIT Compiler (Just-In-Time): Ищет часто выполняемые участки кода (“hotspots”) и компилирует их в машинный код с кэшированием.     *   Tiered Compilation: Использует два компилятора — C1 (быстрая компиляция, базовые оптимизации) и C2 (медленная компиляция, глубокие агрессивные оптимизации).
  •   Garbage Collector (GC): Автоматически очищает Heap от объектов, на которые больше нет ссылок.

D. Garbage Colllector

Алгоритм идет по графу ссылок от GC Roots. Недостижимые объекты удаляются (даже при циклических ссылках).

  • GC Roots:
    • Локальные переменные и параметры методов в стеках потоков.
    • static-переменные классов.
    • Активные потоки (Thread).
    • Ссылки из JNI (Native-код).

Виды ссылок (java.lang.ref)

  1. Strong (Сильная): Object obj = new Object(); — GC не удалит никогда (будет OOM).
  2. Soft (Мягкая): SoftReference<T> — удаляется только при нехватке памяти перед OutOfMemoryError (кэши).
  3. Weak (Слабая): WeakReference<T> — удаляется при любой сборке GC, если нет сильных ссылок (WeakHashMap).
  4. Phantom (Фантомная): PhantomReference<T> — get() возвращает null. Служит для освобождения нативных ресурсов после удаления объекта.

Области Кучи (Поколения)

Основано на гипотезе: 90%+ объектов умирают быстро.

  • Young Generation (Молодое):
    • Eden: место рождения всех новых объектов.
    • Survivor (S0 и S1 / From и To): буферные зоны одинакового размера. В работе всегда только одна, вторая пустая.
  • Old Generation (Старое / Tenured): Долгоживущие объекты (пережившие много сборок) и очень крупные объекты.

Ссылаются сюда 1

main48 заметок564 слов3 мин чтения