Введение

Мобильные платформы.

  • Android.
  • iOS.
  • Windows Mobile.

Курс построен на android.

Структура курса. Лекции

  • Введение.
  • Основные компоненты приложений.
  • Многопоточность в приложениях.
  • Сеть.
  • Adapter Views. Службы (Services).
  • Работа с данными и файлами.
  • Локализация и работа с ресурсами.

Структура курса. Практика

  • 5 лабораторных работ (сентябрь-ноябрь).
  • Для экзамена: Проект (декабрь-январь).
  • Для реализации используем любую среду по желанию.

Инструменты разработчика

JDK
Java Development Kit

Android Studio
Официальная IDE

Gradle
Система сборки

Android SDK
Software Development Kit

Настройка окружения

  • Установка Java JDK
  • Установка Android Studio
  • Настройка Android SDK через SDK Manager
  • Установка эмулятора или настройка реального устройства
  • Знакомство с интерфейсом Android Studio

Первый запуск Android Studio

  • Создание нового проекта (Empty Activity)
  • Обзор структуры проекта
  • Основные файлы: build.gradle, AndroidManifest.xml
  • Запуск на эмуляторе
  • Запуск на физическом устройстве (Debug Mode)

Язык Java: Основы

История и эволюция языка программирования

Java: Философия языка

  • "Write Once, Run Anywhere" - основная концепция
  • Объектно-ориентированный язык
  • Статическая типизация
  • Автоматическое управление памятью (Garbage Collection)
  • Богатая стандартная библиотека
  • Мультиплатформенность

Версии Java: Эволюция

Ранние версии

  • Java 1.0 (1996) - первая версия
  • Java 1.1 (1997) - внутренние классы, JDBC
  • Java 1.2 (1998) - Collections Framework
  • Java 1.4 (2002) - регулярные выражения, NIO
  • Java 5 (2004) - generics, аннотации, enum

Современные версии

  • Java 8 (2014) - лямбды, Stream API
  • Java 11 (2018) - LTS, HTTP Client
  • Java 17 (2021) - LTS, sealed classes
  • Java 21 (2023) - LTS, virtual threads
  • Java 23 (2024) - последняя версия

Java Ecosystem: Компоненты

JRE

Java Runtime Environment

Для запуска Java-приложений

JDK

Java Development Kit

Для разработки (JRE + tools)

JVM

Java Virtual Machine

Исполняющая среда

JRE (Java Runtime Environment)

Среда выполнения Java - это минимальная реализация виртуальной машины для запуска Java-приложений.

Основное назначение

Запуск готовых Java-приложений

Без возможности разработки

JRE в экосистеме Java

JRE включает JVM и библиотеки для выполнения кода

Компоненты JRE

Основные компоненты

  • JVM (Java Virtual Machine)
    • Исполняющий движок
    • Сборщик мусора
    • Интерпретатор байт-кода
  • Библиотеки классов
    • rt.jar (runtime library)
    • Другие JAR-файлы

Вспомогательные компоненты

  • Вспомогательные утилиты
    • java - запуск приложений
    • keytool - управление ключами
    • policytool - управление политиками
  • Файлы конфигурации
    • Файлы свойств
    • Политики безопасности

Сравнение JDK vs JRE vs JVM

Компонент Назначение Включает Для кого
JVM Выполнение байт-кода Исполняющий движок, память Система
JRE Запуск приложений JVM + библиотеки + утилиты Пользователи
JDK Разработка приложений JRE + компилятор + инструменты Разработчики

Библиотеки JRE

Основные пакеты

  • java.lang - базовые классы
  • java.util - коллекции, утилиты
  • java.io - ввод/вывод
  • java.net - сетевые функции
  • java.math - математические операции

Специализированные пакеты

  • java.text - форматирование
  • java.time - дата и время
  • java.security - безопасность
  • java.sql - работа с БД
  • java.awt - графика (десктоп)

Утилиты JRE

Основные утилиты

  • java - запуск приложений
  • javaw - запуск без консоли
  • javaws - запуск Java Web Start
  • pack200 - компрессия JAR

Утилиты безопасности

  • keytool - управление ключами
  • policytool - управление политиками
  • jarsigner - подписание JAR

Процесс запуска приложения

  1. Поиск JRE - через PATH или регистр
  2. Загрузка JVM - создание виртуальной машины
  3. Парсинг аргументов - обработка параметров запуска
  4. Загрузка классов - через ClassLoader
  5. Верификация - проверка байт-кода
  6. Исполнение - интерпретация или JIT-компиляция
  7. Завершение - освобождение ресурсов

Структура директории JRE

jre/
├── bin/                    # Исполняемые файлы
│   ├── java               # Запуск приложений
│   ├── javaw              # Запуск без консоли
│   ├── keytool            # Управление ключами
│   └── ...
├── lib/                   # Библиотеки
│   ├── rt.jar             # Основная библиотека
│   ├── ext/               # Расширения
│   │   ├── localedata.jar
│   │   └── ...
│   └── ...
├── conf/                  # Конфигурация
│   ├── security/          # Настройки безопасности
│   ├── net.properties     # Сетевые настройки
│   └── ...
└── legal/                 # Лицензии
    

Версии JRE

Исторические версии

  • JRE 1.0-1.4 - ранние версии
  • JRE 5 - generics, аннотации
  • JRE 6 - улучшения производительности
  • JRE 7 - NIO.2, try-with-resources

Современные версии

  • JRE 8 - лямбды, Stream API (LTS)
  • JRE 11 - модульная система (LTS)
  • JRE 17 - sealed classes (LTS)
  • JRE 21 - virtual threads (LTS)

Модульная система (Java 9+)

Изменения в JRE

  • Исчез rt.jar - разбит на модули
  • Меньший размер - только необходимые модули
  • jlink - создание custom JRE
  • Модульная структура - четкие зависимости

Преимущества

  • Уменьшенный размер приложений
  • Улучшенная безопасность
  • Лучшая производительность
  • Четкие границы модулей

Создание custom JRE с jlink

# Создание минимальной JRE
jlink --module-path jmods \
      --add-modules java.base,java.sql \
      --output my-custom-jre

# Структура custom JRE
my-custom-jre/
├── bin/
├── conf/
├── lib/
└── legal/
    

Размер может быть уменьшен с 200+ MB до 20-30 MB

Безопасность в JRE

Компоненты безопасности

  • Security Manager - контроль доступа
  • Policy Files - политики безопасности
  • Cryptography - шифрование
  • Certificates - управление сертификатами

Механизмы защиты

  • Sandbox для ненадежного кода
  • Bytecode verification
  • ClassLoader isolation
  • Digital signatures

Установка JRE

Способы установки

  • Пакетные менеджеры
    • apt (Debian/Ubuntu)
    • yum (RedHat/CentOS)
    • brew (macOS)
  • Ручная установка
    • Скачивание с сайта
    • Распаковка архива
    • Настройка PATH

Проверка установки

# Проверка версии
java -version

# Путь к JRE
which java

# Список установленных JRE
/usr/libexec/java_home -V
            

Проблемы и решения

Распространенные проблемы

  • Version mismatch - несовместимость версий
  • ClassNotFound - отсутствующие библиотеки
  • Memory issues - нехватка памяти
  • Security restrictions - ограничения политик

Решения

  • Проверка версии Java
  • Настройка classpath
  • Увеличение памяти (-Xmx)
  • Настройка политик безопасности

Эволюция JRE

Java 1.0-8

  • Monolithic rt.jar
  • Большой размер
  • Фиксированная структура
  • JRE как отдельный продукт

Java 9-16

  • Модульная система
  • jlink для custom JRE
  • Уменьшенный размер
  • JRE в составе JDK

Java 17+

  • Удаление отдельного JRE
  • Только JDK + jlink
  • Продвинутая модульность
  • Cloud-native подход

JRE в современных версиях Java

  • Java 9+: Отдельный JRE больше не поставляется
  • jlink: Инструмент для создания custom runtime
  • Модульность: Только необходимые компоненты
  • Docker образы: Official images с JDK
  • Cloud deployment: Минимальные runtime образы

Практическое использование

Традиционный подход

# Установка JRE
apt install openjdk-11-jre

# Запуск приложения
java -jar myapp.jar
            

Альтернативный подход

# Создание custom runtime
jlink --add-modules java.base \
      --output myruntime

# Запуск
myruntime/bin/java -jar myapp.jar
            

JDK (Java Development Kit)

Комплект разработчика Java - это полный набор инструментов для создания, компиляции, отладки и запуска Java-приложений.

Основное назначение

Разработка Java-приложений

Включает все необходимое для разработки

JDK в экосистеме Java

JDK = JRE + Инструменты разработки

Компоненты JDK

Основные компоненты

  • JRE (Java Runtime Environment)
    • JVM
    • Библиотеки классов
    • Вспомогательные утилиты
  • Компилятор
    • javac
    • Компиляция в байт-код

Инструменты разработки

  • Инструменты отладки
    • jdb
    • jstack
    • jmap
  • Инструменты мониторинга
    • jconsole
    • jvisualvm
    • jstat

Полная структура JDK

Исполняемые инструменты

  • javac - компилятор Java
  • java - запуск приложений
  • javadoc - генерация документации
  • jar - работа с архивами
  • jlink - создание custom runtime
  • jmod - работа с модулями

Инструменты отладки

  • jdb - Java debugger
  • jstack - дамп потоков
  • jmap - дамп памяти
  • jconsole - мониторинг
  • jvisualvm - продвинутый мониторинг
  • jinfo - информация о процессе

Структура директории JDK

jdk/
├── bin/                    # Исполняемые файлы
│   ├── javac              # Компилятор
│   ├── java               # Запуск приложений
│   ├── javadoc            # Генерация документации
│   ├── jar                # Работа с JAR-архивами
│   ├── jdb                # Отладчик
│   ├── jstack             # Анализ потоков
│   ├── jmap               # Анализ памяти
│   ├── jconsole           # Мониторинг
│   ├── jvisualvm          # Визуальный мониторинг
│   ├── jlink              # Создание custom runtime
│   ├── jmod               # Работа с JMOD-файлами
│   └── ...
├── lib/                   # Библиотеки разработки
│   ├── tools.jar          # Инструменты разработки
│   ├── dt.jar             # DesignTime библиотеки
│   └── ...
├── jmods/                 # Модули Java (Java 9+)
│   ├── java.base.jmod
│   ├── java.sql.jmod
│   └── ...
├── include/               # Нативные header-файлы
│   ├── jni.h
│   └── ...
├── conf/                  # Конфигурация
│   ├── security/
│   ├── net.properties
│   └── ...
├── legal/                 # Лицензии
└── README.html            # Документация
    

Основные инструменты JDK

Компиляция и запуск

  • javac - компиляция .java → .class
  • java - запуск приложений
  • javaw - запуск без консоли (Windows)
  • javap - дизассемблер байт-кода

Упаковка и документация

  • jar - создание и управление JAR
  • javadoc - генерация HTML-документации
  • jlink - создание custom runtime
  • jmod - работа с модулями

Инструменты мониторинга и отладки

Командная строка

  • jps - список Java-процессов
  • jstat - статистика JVM
  • jstack - дамп потоков выполнения
  • jmap - дамп памяти
  • jinfo - информация о конфигурации
  • jcmd - универсальная команда

Графические утилиты

  • jconsole - мониторинг JMX
  • jvisualvm - продвинутый мониторинг
  • Java Mission Control - профилирование
  • Java Flight Recorder - запись событий

Процесс разработки с JDK

  1. Написание кода - создание .java файлов
  2. Компиляция - javac → .class файлы
  3. Упаковка - jar → JAR архив
  4. Запуск - java -jar application.jar
  5. Отладка - jdb, jstack, jmap
  6. Профилирование - jvisualvm, JMC
  7. Документирование - javadoc

Практические примеры использования

Базовые операции

# Компиляция
javac HelloWorld.java

# Запуск
java HelloWorld

# Создание JAR
jar cvf app.jar *.class

# Запуск JAR
java -jar app.jar
            

Мониторинг и отладка

# Список процессов
jps -l

# Статистика памяти
jstat -gc 12345

# Дамп потоков
jstack 12345

# Дамп памяти
jmap -heap 12345
            

Версии JDK

Исторические версии

  • JDK 1.0 (1996) - первая версия
  • JDK 1.1 (1997) - внутренние классы, JDBC
  • JDK 1.2 (1998) - Collections Framework
  • JDK 1.4 (2002) - регулярные выражения, NIO
  • JDK 5 (2004) - generics, аннотации, enum

Современные версии

  • JDK 8 (2014) - лямбды, Stream API (LTS)
  • JDK 11 (2018) - модульная система (LTS)
  • JDK 17 (2021) - sealed classes (LTS)
  • JDK 21 (2023) - virtual threads (LTS)
  • JDK 23 (2024) - текущая версия

Поставщики JDK

Поставщик Продукт Особенности Лицензия
Oracle Oracle JDK Официальная реализация, коммерческая поддержка OTN License
OpenJDK OpenJDK Эталонная реализация, открытый код GPLv2+CE
Eclipse Eclipse Temurin Бывший AdoptOpenJDK, мультиплатформенный GPLv2+CE
Amazon Amazon Corretto Бесплатная LTS-сборка GPLv2+CE
Microsoft Microsoft Build Оптимизирован для Windows GPLv2+CE
Azul Zulu Мультиплатформенная сборка GPLv2+CE

Модульная система (Java 9+)

Изменения в JDK

  • Исчез rt.jar - разбит на модули
  • Модульная структура - jmods directory
  • jlink - создание custom runtime
  • jmod - работа с модулями
  • Меньший размер - только необходимые модули

Новые инструменты

  • jlink - создание custom JRE
  • jmod - управление JMOD-файлами
  • jshell - REPL для Java
  • jdeps - анализ зависимостей

Инструменты модульной системы

jlink - создание custom runtime

# Создание минимальной JRE
jlink --module-path jmods \
      --add-modules java.base,java.sql \
      --output my-runtime

# Размер: ~30MB вместо 200+MB
            

jdeps - анализ зависимостей

# Анализ зависимостей
jdeps myapp.jar

# Рекомендации модулей
jdeps --suggest-modules myapp.jar

# Статистика зависимостей
jdeps --summary myapp.jar
            

Установка и настройка JDK

Способы установки

  • Пакетные менеджеры
    • apt install openjdk-11-jdk
    • yum install java-11-openjdk-devel
    • brew install openjdk@11
  • Ручная установка
    • Скачивание с сайта поставщика
    • Распаковка архива
    • Настройка переменных окружения

Настройка окружения

# Переменные окружения
export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

# Проверка установки
java -version
javac -version

# Список установленных JDK
/usr/libexec/java_home -V
            

Интеграция с IDE

IntelliJ IDEA

  • File → Project Structure
  • SDK Manager
  • Автоопределение JDK
  • Поддержка multiple JDK

Eclipse

  • Window → Preferences
  • Java → Installed JREs
  • Добавление JDK
  • Настройка compliance

VS Code

  • Java Extension Pack
  • Настройка java.home
  • Java Runtime Configuration
  • Поддержка Maven/Gradle

Проблемы и решения

Распространенные проблемы

  • Version mismatch - несовместимость версий
  • Classpath issues - неправильные пути
  • Memory issues - нехватка памяти для компиляции
  • Module issues - проблемы с модулями

Решения

  • Проверка версий java/javac
  • Правильная настройка classpath/modulepath
  • Увеличение памяти компилятора
  • Использование --module-path

Будущее JDK

Технические тренды

  • Project Loom - виртуальные потоки
  • Project Valhalla - value types
  • Project Panama - native interop
  • Project Amber - упрощение синтаксиса
  • GraalVM - полиглотная JVM

Экосистемные тренды

  • Cloud-native разработка
  • Контейнеризация (Docker)
  • Микросервисная архитектура
  • Serverless computing
  • Native image (AOT компиляция)

Практические рекомендации

  • Выбирайте LTS-версии для production (11, 17, 21)
  • Используйте jlink для создания минимальных runtime
  • Настраивайте memory settings для больших проектов
  • Следите за обновлениями безопасности
  • Используйте инструменты мониторинга для оптимизации
  • Осваивайте модульную систему для современных приложений

JVM

Виртуальная машина Java - основа кроссплатформенности

JVM: Философия и назначение

Виртуальная машина Java — это абстрактная вычислительная машина, которая обеспечивает кроссплатформенность Java-приложений по принципу "Write Once, Run Anywhere".

Основные задачи JVM

  • Загрузка и верификация байт-кода
  • Выполнение программ
  • Управление памятью (сборка мусора)
  • Обеспечение безопасности
  • Оптимизация производительности

Архитектура JVM: Общий обзор

Основные компоненты виртуальной машины Java

Детальная архитектура JVM

Основные компоненты

  • Class Loader Subsystem
    • Loading
    • Linking
    • Initialization
  • Runtime Data Areas
    • Method Area
    • Heap Area
    • Stack Area
    • PC Registers
    • Native Method Stack

Исполняющие компоненты

  • Execution Engine
    • Interpreter
    • JIT Compiler
    • Garbage Collector
  • Native Method Interface (JNI)
  • Native Method Libraries

Подсистема загрузки классов (Class Loader)

Иерархия загрузчиков

  1. Bootstrap ClassLoader
    Загружает核心 библиотеки (rt.jar)
  2. Platform ClassLoader
    Загружает расширения платформы
  3. Application ClassLoader
    Загружает классы приложения

Принципы работы

  • Delegation Principle - делегирование родителю
  • Visibility Principle - видимость классов
  • Uniqueness Principle - уникальность загрузки

Процесс загрузки класса

1. Loading

  • Поиск .class файла
  • Чтение байт-кода
  • Создание Class объекта
  • Сохранение в Method Area

2. Linking

  • Verification - проверка корректности
  • Preparation - выделение памяти
  • Resolution - разрешение ссылок

3. Initialization

  • Инициализация static полей
  • Выполнение static блоков
  • Вызов конструктора родителя

Method Area (Область методов)

  • Назначение: Хранение метаинформации о классах
  • Содержимое:
    • Структура класса
    • Константный пул (Constant Pool)
    • Код методов
    • Статические переменные
  • Особенности:
    • Общая для всех потоков
    • Может быть garbage collected
    • Ранее называлась Permanent Generation
    • В современных JVM - Metaspace

Heap Area (Куча)

Структура кучи

  • Young Generation
    • Eden Space
    • Survivor Space (S0, S1)
  • Old Generation
  • Metaspace (вне кучи)

Характеристики

  • Динамическое выделение памяти
  • Общая для всех потоков
  • Подвержена сборке мусора
  • Настройки через Xmx, Xms

Жизненный цикл объекта в куче

  1. Создание - объект создается в Eden Space
  2. Minor GC - выжившие объекты перемещаются в Survivor Space
  3. Копирование - объекты копируются между S0 и S1
  4. Promotion - после нескольких циклов объекты перемещаются в Old Generation
  5. Major GC - очистка Old Generation

Stack Area (Стек)

Структура стека

  • Stack Frame - фрейм для каждого метода
  • Local Variables - локальные переменные
  • Operand Stack - стек операндов
  • Reference to Runtime Constant Pool

Характеристики

  • Приватный для каждого потока
  • Быстрый доступ (LIFO)
  • Фиксированный размер
  • StackOverflowError при переполнении

Execution Engine (Исполняющий движок)

Interpreter

Интерпретатор байт-кода

  • Простая реализация
  • Медленное выполнение
  • Используется при старте

JIT Compiler

Just-In-Time компилятор

  • Компиляция в нативный код
  • Высокая производительность
  • Профилирование кода

Garbage Collector

Сборщик мусора

  • Автоматическое управление памятью
  • Различные алгоритмы
  • Минимизация пауз

JIT-компиляция: Детали работы

Типы компиляторов

  • C1 Compiler - клиентский, быстрая компиляция
  • C2 Compiler - серверный, агрессивные оптимизации
  • Tiered Compilation - комбинированный подход

Оптимизации JIT

  • Inlining методов
  • Escape Analysis
  • Loop Unrolling
  • Dead Code Elimination
  • Lock Coarsening

Сборка мусора: Алгоритмы

Алгоритм Тип Паузы Использование
Serial GC Stop-the-World Длинные Однопоточные приложения
Parallel GC Stop-the-World Средние Многопроцессорные системы
CMS Concurrent Короткие Приложения с низкой задержкой
G1 GC Concurrent Предсказуемые Большие кучи (>4GB)
ZGC Concurrent Минимальные Очень большие кучи
Shenandoah Concurrent Минимальные Низкие задержки

Garbage Collection: Детали процесса

Типы сборок

  • Minor GC - очистка Young Generation
  • Major GC - очистка Old Generation
  • Full GC - очистка всей кучи
  • Mixed GC - (G1) сборка частей кучи

Алгоритмы marking

  • Mark-Sweep - пометка и удаление
  • Mark-Compact - пометка и уплотнение
  • Copying - копирование живых объектов
  • Generational - разделение по возрастам

JVM: Управление производительностью

Мониторинг

  • jstat - статистика GC
  • jstack - дамп потоков
  • jmap - дамп памяти
  • VisualVM - графический мониторинг
  • JMX - управление через MBeans

Настройки

  • -Xms - начальный размер кучи
  • -Xmx - максимальный размер кучи
  • -XX:NewRatio - соотношение поколений
  • -XX:SurvivorRatio - соотношение Eden/Survivor
  • -XX:+UseG1GC - выбор сборщика

JVM: Безопасность

Механизмы безопасности

  • Bytecode Verifier - проверка байт-кода
  • Class Loader Security - изоляция классов
  • Security Manager - управление permissions
  • Access Control - контроль доступа

Sandbox модель

  • Изоляция ненадежного кода
  • Ограничения на операции
  • Политика безопасности
  • Подписанные апплеты

Реализации JVM: Сравнение

Реализация Разработчик Особенности Использование
HotSpot Oracle Высокая производительность, advanced JIT Стандартная реализация
OpenJ9 Eclipse Низкое потребление памяти, быстрый старт Cloud, containers
GraalVM Oracle Полиглот, AOT компиляция Microservices, native
Zing Azul Нулевые паузы GC (C4) Real-time системы

JVM Languages: Мультиязычность

Статическая типизация

  • Java
  • Kotlin
  • Scala
  • Groovy (optional)

Динамическая типизация

  • JRuby
  • Jython
  • JavaScript (Nashorn)

Функциональные

  • Clojure
  • Frege
  • Eta

JVM: Будущее и тренды

Технические тренды

  • Project Loom - виртуальные потоки
  • Project Valhalla - value types
  • Project Panama - native interop
  • Project Amber - упрощение синтаксиса

Экосистемные тренды

  • Контейнеризация и cloud-native
  • Native image (GraalVM)
  • Микросервисная архитектура
  • Serverless computing

Практическое значение JVM

  • Кроссплатформенность - один байт-код на всех платформах
  • Производительность - современные оптимизации JIT
  • Надежность - автоматическое управление памятью
  • Безопасность - встроенные механизмы защиты
  • Экосистема - богатый набор инструментов и библиотек

Сравнение JDK vs JRE vs JVM

Компонент Назначение Включает Для кого
JVM Выполнение байт-кода Исполняющий движок, память Система
JRE Запуск приложений JVM + библиотеки + утилиты Пользователи
JDK Разработка приложений JRE + компилятор + инструменты разработки Разработчики

Процесс компиляции и выполнения

Java Source (.java) → javac → Bytecode (.class) → JVM → Machine Code

JIT-компиляция

Just-In-Time компиляция - оптимизация производительности

  • Интерпретация байт-кода при первом запуске
  • Профилирование "горячих" методов
  • Компиляция часто используемого кода в нативный
  • Постоянная оптимизация во время выполнения

Сборщики мусора (Garbage Collectors)

Традиционные

  • Serial GC - для однопоточных приложений
  • Parallel GC - для многопроцессорных систем
  • CMS - Concurrent Mark Sweep

Современные

  • G1 GC - баланс производительности
  • ZGC - низкие задержки, большие кучи
  • Shenandoah - низкие паузы

Структура .class файла

ClassFile {
    u4 magic;                 // 0xCAFEBABE
    u2 minor_version;         // Минорная версия
    u2 major_version;         // Мажорная версия
    u2 constant_pool_count;   // Размер пула констант
    cp_info constant_pool[constant_pool_count-1]; // Пул констант
    u2 access_flags;          // Флаги доступа
    u2 this_class;            // Индекс текущего класса
    u2 super_class;           // Индекс родительского класса
    u2 interfaces_count;      // Количество интерфейсов
    u2 interfaces[interfaces_count]; // Интерфейсы
    u2 fields_count;          // Количество полей
    field_info fields[fields_count]; // Поля
    u2 methods_count;         // Количество методов
    method_info methods[methods_count]; // Методы
    u2 attributes_count;      // Количество атрибутов
    attribute_info attributes[attributes_count]; // Атрибуты
}
    

Пример Java кода


package ru.petrsu.cross;

public class HelloWorld {
    public static void main(String[] args) {
        say("Hello");
        say("World!");
    }

    public static void say(String str) {
        System.out.println(str);
    }
}
    

Декомпиляция байт-кода


$ javac HelloWorld.java
$ javap -c HelloWorld
    
Compiled from "HelloWorld.java"
public class ru.petrsu.cross.HelloWorld {
  public ru.petrsu.cross.HelloWorld();
    Code:
       0: aload_0
       1: invokespecial #1  // Method java/lang/Object."":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2  // String Hello
       2: invokestatic  #3  // Method say:(Ljava/lang/String;)V
       5: ldc           #4  // String World!
       7: invokestatic  #3  // Method say:(Ljava/lang/String;)V
      10: return

  public static void say(java.lang.String);
    Code:
       0: getstatic     #5  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: aload_0
       4: invokevirtual #6  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       7: return
}
    

Инструкции байт-кода

Типы инструкций

  • Stack Management
  • Arithmetic Operations
  • Type Conversions
  • Object Creation
  • Field Access

Примеры

  • aload, iload
  • iadd, imul
  • i2l, f2d
  • new, newarray
  • getfield, putfield

Вызов методов в JVM

Инструкция Назначение Тип связывания
invokestatic Статические методы Статическое
invokevirtual Виртуальные методы Динамическое
invokeinterface Методы интерфейсов Динамическое
invokespecial Конструкторы, private методы Статическое
invokedynamic Динамические вызовы Динамическое

Управление памятью: Стек vs Куча

Характеристика Стек Куча
Скорость доступа Очень высокая Относительно медленная
Управление памятью LIFO, автоматическое Динамическое, GC
Размер Ограниченный Динамический
Потокобезопасность Да (у каждого потока свой) Требует синхронизации
Хранение Примитивы, ссылки Объекты

Сборка мусора (Garbage Collection)

Автоматическое освобождение неиспользуемой памяти

  • Mark - пометка используемых объектов
  • Sweep - удаление непомеченных объектов
  • Compact - уплотнение памяти (опционально)
  • Copy - копирование в новое пространство

Типы сборщиков мусора

По алгоритму

  • Serial Collector
  • Parallel Collector
  • Concurrent Mark Sweep (CMS)
  • Garbage First (G1)
  • Z Garbage Collector (ZGC)
  • Shenandoah

По поколениям

  • Young Generation (Eden, S0, S1)
  • Old Generation (Tenured)
  • Permanent Generation (Metaspace)

Serial Collector (Последовательный сборщик)

  • Алгоритм: Использует алгоритм Mark-Sweep-Compact для старого поколения (Old Generation) и простой копирующий алгоритм (Copying) для молодого (Young Generation). Работает в однопоточном режиме.
  • Принцип работы: На время сборки мусора (Stop-The-World) все рабочие потоки приложения приостанавливаются. Все операции (маркировка, удаление, уплотнение) выполняются одним потоком.
  • Сборщик по умолчанию на машинах с единственным процессорным ядром. Не предназначен для высокопроизводительных приложений.
  • Простота и минимальные накладные расходы.
  • Эффективен для однопоточных систем и приложений с маленькой кучей (несколько десятков МБ).
  • Длительные паузы (Stop-The-World), неприемлемые для большинства современных приложений.
  • -XX:+UseSerialGC

Parallel Collector (Параллельный сборщик / Throughput Collector)

  • Алгоритм: Также использует Mark-Sweep-Compact и Copying, но выполняет их с помощью множества потоков, что ускоряет процесс.
  • Принцип работы: Как и Serial, это Stop-The-World сборщик. Однако он использует несколько потоков для ускорения сборки мусора в молодом поколении (что очень эффективно) и, опционально, также для сборки в старом.
  • Максимизация пропускной способности (throughput) приложения. Идеален для фоновых задач, пакетной обработки, где длительность отдельных пауз не критична, но важна общая производительность.
  • Значительно выше пропускная способность по сравнению с Serial за счет многопоточности.
  • Стандартный сборщик в Java 8 и более ранних.
  • Паузы (Stop-The-World) всё ещё могут быть длительными, особенно при работе с большой кучей.
  • Активация: -XX:+UseParallelGC (только Young Gen) или -XX:+UseParallelOldGC (оба поколения)

Concurrent Mark Sweep (CMS)

  • Алгоритм: Использует алгоритм конкурентной маркировки и очистки (Mark-Sweep) для старого поколения. Молодое поколение собирается с помощью многопоточного Stop-The-World алгоритма, аналогичного Parallel.
  • Принцип работы: Большая часть работы по сборке мусора в старом поколении выполняется параллельно с рабочими потоками приложения. Цель — минимизировать паузы. Не уплотняет память (не делает компактизацию).
  • Цель: Низкая задержка (low latency) для приложений, чувствительных к паузам (например, веб-серверы, GUI-приложения).
  • Короткие паузы, так как основная работа ведется конкурентно.
  • Не уплотняет память, что приводит к фрагментации кучи.
  • Выше нагрузка на CPU (плата за конкурентность).
  • Более сложная настройка.
  • Удален, начиная с Java 14. Не рекомендуется к использованию.
  • Активация: -XX:+UseConcMarkSweepGC

Garbage First (G1GC)

  • "Сначала мусор". Разделяет кучу на множество регионов фиксированного размера. Использует алгоритм эволюции от маркировки-очистки к маркировке-уплотнению.
  • Помечает живые объекты во время фазы, параллельной с приложением.
  • Затем вычисляет, в каких регионах больше всего мусора (отсюда и название).
  • В первую очередь собирает эти регионы (это форма эвакуации/уплотнения), что позволяет эффективно освобождать большие объемы памяти.
  • Замена CMS. Баланс между пропускной способностью и низкими паузами. Целевая пауза (часто ~200 мс) настраивается пользователем.
  • Предсказуемые паузы.
  • Хорошо работает с кучами от 4-5 ГБ до десятков ГБ.
  • Сборщик по умолчанию с Java 9.
  • По сравнению с ZGC/Shenandoah паузы всё ещё могут быть ощутимыми.
  • Активация: -XX:+UseG1GC (по умолчанию с Java 9+)

Z Garbage Collector (ZGC)

  • Основан на одновременной маркировке-уплотнении (конкурентном компактировании) с использованием указателей с цветовой разметкой (colored pointers) и load barriers (барьеров чтения).
  • Принцип работы: Выполняет всю тяжелую работу (маркировку, уплотнение, перемещение объектов) одновременно с выполнением приложения. Паузы (Stop-The-World) ограничены по длительности только необходимостью сканировать корневые элементы (порядка 1-2 мс) и не зависят от размера кучи.
  • Сверхнизкие паузы (менее 10 мс даже для терабайтных куч) без ущерба для пропускной способности.
  • Паузы суб-миллисекундные, не растут с увеличением размера кучи.
  • Очень высокая масштабируемость.
  • Поддерживает огромные объемы памяти (несколько ТБ).
  • Более высокая нагрузка на CPU (плата за низкие задержки).
  • Активация: -XX:+UseZGC

Shenandoah

  • Как и ZGC, использует алгоритм одновременной маркировки-уплотнения. Ключевое отличие — в реализации механизма конкурентного перемещения объектов.
  • Принцип работы: Также выполняет уплотнение одновременно с работой приложения. Вместо цветных указателей использует барьеры чтения и записи (write barriers) и forwarding-указатели для управления перемещенными объектами.
  • Аналогична ZGC — сверхнизкие паузы (также порядка 1-2 мс), не зависящие от размера кучи.
  • Чрезвычайно низкие паузы.
  • Хорошая производительность.
  • Как и у ZGC, повышенное использование CPU.
  • Активация: -XX:+UseShenandoahGC

Эволюция Java: От 8 к 23

Основные изменения и нововведения

Java 8 (LTS, 2014) - Функциональное программирование

  • Лямбда-выражения - анонимные функции
  • Stream API - функциональная обработка данных
  • Методы по умолчанию в интерфейсах
  • Optional - борьба с NPE
  • New Date/Time API - java.time package
  • Nashorn JavaScript Engine

Java 9 (2017) - Модульная система

  • Project Jigsaw - модульная система
  • JShell - REPL для Java
  • Factory Methods for Collections - List.of(), Set.of()
  • HTTP/2 Client (incubator)
  • Private methods in interfaces
  • Reactive Streams

Java 10 (2018) - Локальный вывод типов

  • Local-Variable Type Inference - ключевое слово var
  • Garbage-Collector Interface - улучшенная архитектура GC
  • Parallel Full GC for G1
  • Application Class-Data Sharing
  • Root Certificates - обновленная security

Java 11 (LTS, 2018) - Стабильность и производительность

  • HTTP Client API - стандартизация
  • Launch Single-File Source-Code Programs - java HelloWorld.java
  • New String Methods - isBlank(), lines(), repeat()
  • Epsilon GC - no-op сборщик мусора
  • Flight Recorder - мониторинг production
  • Nest-Based Access Control

Java 12-14 - Подготовка к будущему

Java 12

  • Switch Expressions (preview)
  • Shenandoah GC
  • Microbenchmark Suite

Java 13

  • Text Blocks (preview)
  • Switch Expressions (preview)
  • ZGC enhancements

Java 14

  • Switch Expressions (standard)
  • Records (preview)
  • Pattern Matching (preview)

Java 15 (2020) - Sealed Classes и текстовые блоки

  • Sealed Classes (preview) - контроль наследования
  • Text Blocks (standard) - многострочные строки
  • Hidden Classes - для фреймворков
  • ZGC & Shenandoah - production-ready
  • EdDSA Algorithm - криптография
  • Records (second preview)

Java 16 (2021) - Стандартизация нововведений

  • Records (standard) - неизменяемые data-классы
  • Pattern Matching for instanceof (standard)
  • Stream.toList() method - удобный сбор в список
  • Vector API (incubator) - векторные вычисления
  • Unix-Domain Socket Channels
  • Alpine Linux Port

Java 17 (LTS, 2021) - Современная база

  • Sealed Classes (standard)
  • Pattern Matching for switch (preview)
  • Foreign Function & Memory API (incubator)
  • Enhanced Pseudo-Random Number Generators
  • Context-Specific Deserialization Filters
  • New macOS Rendering Pipeline

Java 18-20 - Подготовка к виртуальным потокам

Java 18

  • UTF-8 by Default
  • Simple Web Server
  • Code Snippets in JavaDoc

Java 19

  • Virtual Threads (preview)
  • Pattern Matching for switch (3rd preview)
  • Foreign Function & Memory API (preview)

Java 20

  • Virtual Threads (2nd preview)
  • Scoped Values (preview)
  • Record Patterns (preview)

Java 21 (LTS, 2023) - Революция в многопоточности

  • Virtual Threads (standard) - легковесные потоки
  • Pattern Matching for switch (standard)
  • Record Patterns (standard)
  • Sequenced Collections - новые интерфейсы
  • String Templates (preview)
  • Key Encapsulation Mechanism API

Java 22 (2024) - Улучшения и стабилизация

  • String Templates (second preview)
  • Implicitly Declared Classes (preview)
  • Foreign Function & Memory API (final)
  • Stream Gatherers (preview)
  • Class-File API (preview)
  • Statements before super() (preview)

Java 23 (2024) - Текущая версия

  • Vector API (8th incubator) - векторные вычисления
  • Stream Gatherers (preview) - кастомные операции
  • Implicitly Declared Classes (second preview)
  • Primitive Types in Patterns (preview)
  • Generational ZGC - улучшенный сборщик мусора
  • Launch Multi-File Source-Code Programs

Тенденции развития Java

  • Упрощение синтаксиса - records, pattern matching
  • Улучшение производительности - виртуальные потоки, новые GC
  • Безопасность - улучшенная криптография
  • Межъязыковое взаимодействие - Foreign Function API
  • Упрощение обучения - неявные классы