Usefull:
- Bean Lifecycle: https://medium.com/@zaam.oussama/java-development-kit-jdk-exploring-its-components-and-functionality-8f6d6c2a046c
- Spring Security: https://blog.stackademic.com/chain-of-responsibility-design-pattern-84ac20f0f7ed
› Базовая триада

- 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-кода

- Написание: Создание исходного кода приложения в файлах (
.java). - Статическая компиляция (Front-end): Утилита
javacпроверяет синтаксис и компилирует исходный код в платформонезависимый байт-код (.class). - Загрузка и верификация (ClassLoader Subsystem):
- Loading (Загрузка):
ClassLoaderсчитывает байты из.classфайлов и размещает метаданные классов в области памяти (Method Area / Metaspace). - Verification (Верификация): Байт-код проходит строгую проверку безопасности на соответствие спецификации JVM (контроль типов, проверка переполнения стека, отсутствие прямого доступа к чужой памяти).
- Loading (Загрузка):
- Исполнение и динамическая оптимизация (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)
- Strong (Сильная):
Object obj = new Object();— GC не удалит никогда (будетOOM). - Soft (Мягкая):
SoftReference<T>— удаляется только при нехватке памяти передOutOfMemoryError(кэши). - Weak (Слабая):
WeakReference<T>— удаляется при любой сборке GC, если нет сильных ссылок (WeakHashMap). - Phantom (Фантомная):
PhantomReference<T>—get()возвращаетnull. Служит для освобождения нативных ресурсов после удаления объекта.
Области Кучи (Поколения)
Основано на гипотезе: 90%+ объектов умирают быстро.
- Young Generation (Молодое):
- Eden: место рождения всех новых объектов.
- Survivor (S0 и S1 / From и To): буферные зоны одинакового размера. В работе всегда только одна, вторая пустая.
- Old Generation (Старое / Tenured): Долгоживущие объекты (пережившие много сборок) и очень крупные объекты.