Мобильные платформы.
- Android.
- iOS.
- Windows Mobile.
Курс построен на android.
Структура курса. Лекции
- Введение.
- Основные компоненты приложений.
- Многопоточность в приложениях.
- Сеть.
- Adapter Views. Службы (Services).
- Работа с данными и файлами.
- Локализация и работа с ресурсами.
Структура курса. Практика
- 5 лабораторных работ (сентябрь-ноябрь).
- Для экзамена: Проект (декабрь-январь).
- Для реализации используем любую среду по желанию.
Инструменты разработчика
Android Studio
Официальная IDE
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
Процесс запуска приложения
- Поиск JRE - через PATH или регистр
- Загрузка JVM - создание виртуальной машины
- Парсинг аргументов - обработка параметров запуска
- Загрузка классов - через ClassLoader
- Верификация - проверка байт-кода
- Исполнение - интерпретация или JIT-компиляция
- Завершение - освобождение ресурсов
Структура директории 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
- Компиляция в байт-код
Инструменты разработки
- Инструменты отладки
- Инструменты мониторинга
Полная структура 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
- Написание кода - создание .java файлов
- Компиляция - javac → .class файлы
- Упаковка - jar → JAR архив
- Запуск - java -jar application.jar
- Отладка - jdb, jstack, jmap
- Профилирование - jvisualvm, JMC
- Документирование - 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)
Иерархия загрузчиков
- Bootstrap ClassLoader
Загружает核心 библиотеки (rt.jar)
- Platform ClassLoader
Загружает расширения платформы
- 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
Жизненный цикл объекта в куче
- Создание - объект создается в Eden Space
- Minor GC - выжившие объекты перемещаются в Survivor Space
- Копирование - объекты копируются между S0 и S1
- Promotion - после нескольких циклов объекты перемещаются в Old Generation
- 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)
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
- Упрощение обучения - неявные классы