Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье представлен обзор рекомендуемых стратегий и параметров для контейнеризации приложений Java. При контейнеризации приложения Java тщательно рассмотрите объем доступного времени ЦП контейнера. Затем рассмотрим, сколько памяти доступно как с точки зрения общего объема памяти, так и размера кучи виртуальной машины Java (JVM). В контейнерных средах приложения могут иметь доступ ко всем процессорам и, следовательно, иметь возможность параллельного выполнения нескольких потоков. Однако обычно контейнеры имеют квоту ЦП, которая может регулировать доступ к ЦП.
JVM использует эвристики для определения количества "доступных процессоров" на основе квоты ЦП, что может значительно повлиять на производительность Java приложений. Память, выделенная самому контейнеру, и размер области кучи для виртуальной машины JVM так же важен, как процессоры. Эти факторы определяют поведение сборщика мусора (GC) и общую производительность системы.
Подсказка
Если вы не хотите настраивать эти параметры вручную, средство запуска команд Azure для Java (jaz) автоматически применяет для вас параметры JVM на основе облака. Это полноценная замена для команды java, которая определяет ограничения контейнера и выбирает оптимальный размер кучи и флаги GC. Дополнительные сведения см. в статье Автоматическое настройка JVM с помощью средства запуска команд Azure для Java.
Контейнеризация нового приложения
При контейнеризации рабочей нагрузки Java для нового приложения следует учитывать две вещи при рассмотрении памяти:
- Память, выделенная самому контейнеру.
- Объем памяти, доступный для процесса Java.
Общие сведения о эргономике JVM по умолчанию
Приложения нуждаются в начальной точке и параметрах. JVM имеет эргономика по умолчанию с предопределенными значениями, основанными на количестве доступных процессоров и объеме памяти в системе. JVM использует значения по умолчанию, отображаемые в следующих таблицах при запуске без определенных флагов запуска или параметров.
В следующей таблице показана сборка GC по умолчанию для доступных ресурсов:
| Доступные ресурсы | GC по умолчанию |
|---|---|
| Любое количество процессоров До 1791 МБ памяти |
SerialGC |
| более 2 процессоров 1792 МБ или больше памяти |
G1GC |
В следующей таблице показан максимальный размер кучи по умолчанию в зависимости от объема доступной памяти в среде, в которой выполняется JVM:
| Доступная память | Максимальный размер кучи по умолчанию |
|---|---|
| До 256 МБ | 50% объема доступной памяти |
| 256 МБ до 512 МБ | ~127 МБ |
| Более 512 МБ | 25% доступной памяти |
Начальный размер кучи по умолчанию — 1/64 доступной памяти. Эти значения допустимы для OpenJDK 11 и более поздних версий, а также для большинства дистрибутивов, включая Microsoft Build OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK и другие.
Определение памяти контейнера
Выберите объем памяти контейнера, который лучше всего подходит для рабочей нагрузки, в зависимости от потребностей приложения и его отличительных шаблонов использования. Например, если приложение создает графы больших объектов, вероятно, требуется больше памяти, чем для приложений с большим количеством графов объектов.
Подсказка
Если вы не знаете, сколько памяти выделяется, хорошая начальная точка составляет 4 ГБ.
Определение объема памяти кучи JVM
При выделении памяти под кучу JVM помните, что JVM требуется больше памяти, чем объём, который вы выделяете под кучу JVM. Не устанавливайте максимальный объем памяти кучи JVM, равный объему памяти контейнера. Эта настройка может вызывать ошибки нехватки памяти (OOM) и аварийное завершение работы контейнера.
Подсказка
Выделите 75% памяти контейнера для кучи памяти JVM.
В OpenJDK 11 и более поздних версиях задайте размер кучи JVM одним из следующих способов:
| Описание | Флаг | Примеры |
|---|---|---|
| Фиксированное значение | -Xmx |
-Xmx4g |
| Динамическое значение | -XX:MaxRAMPercentage |
-XX:MaxRAMPercentage=75 |
Минимальный или начальный размер кучи
Если среда гарантирует определенный объем памяти, зарезервированный для экземпляра JVM, например в контейнере, задайте минимальный размер кучи или начальный размер кучи таким же размером, что и максимальный размер кучи. Этот параметр указывает JVM, что она не должна выполнять задачу освобождения памяти ОС.
Чтобы задать минимальный размер кучи, используйте -Xms для абсолютных сумм или -XX:InitialRAMPercentage процентных сумм.
Это важно
Несмотря на то, что предполагает имя, флаг -XX:MinRAMPercentage задает максимальный процент ОЗУ по умолчанию для систем с размером до 256 МБ ОЗУ, доступных в системе.
Определите, какой сборщик мусора использовать
Ранее вы определили объем памяти кучи JVM для начала. Следующим шагом является выбор вашего Генерального подрядчика. Объем максимальной памяти кучи JVM часто влияет на выбор GC. В следующей таблице описываются характеристики каждой сборки мусора.
| Факторы | SerialGC | ParallelGC | G1GC | ZGC | ShenandoahGC |
|---|---|---|---|---|---|
| Число ядер | 1 | 2 | 2 | 2 | 2 |
| Многопоточный | нет | Да | Да | Да | Да |
| Размер кучи Java | <4 ГБ | <4 ГБ | >4 ГБ | >4 ГБ | >4 ГБ |
| Пауза | Да | Да | Да | Да (<1 мс) | Да (<10 мс) |
| Накладные расходы | Минимальный | Минимальный | Умеренный | Умеренный | Умеренный |
| Эффект задержки хвоста | Высоко | Высоко | Высоко | Низкий уровень | Умеренный |
| Версия JDK | Все | Все | JDK 8+ | JDK 17+ | JDK 11+ |
| Лучше всего подходит для | Одно ядро небольших кучи | Многоядерные небольшие кучи или пакетные рабочие нагрузки с любым размером кучи | Откликается на запрос-ответ и взаимодействия с базой данных при средних и больших объемах нагрузки | Откликается на запрос-ответ и взаимодействия с базой данных при средних и больших объемах нагрузки | Откликается на запрос-ответ и взаимодействия с базой данных при средних и больших объемах нагрузки |
Подсказка
Для большинства приложений микросервисов общего назначения начните с Параллельного GC.
Определение количества необходимых ядер ЦП
Для любой сборки, отличной от SerialGC, используйте два или более ядер виртуального ЦП или по крайней мере 2000m для cpu_limit Kubernetes. Не выбирайте меньше одного ядра виртуального ЦП в контейнерных средах.
Подсказка
Если вы не знаете, сколько ядер для начала, хороший выбор — два ядра виртуального ЦП.
Выбор начальной точки
Начните с двух реплик или экземпляров в средах оркестрации контейнеров, таких как Kubernetes, OpenShift, Приложения Azure Spring, Контейнеры приложений Azure и Служба приложений Azure. В следующей таблице приведены рекомендуемые начальные точки для контейнеризации нового приложения Java.
| Ядра vCPU | Память контейнера | Размер кучи JVM | GC | Копии |
|---|---|---|---|---|
| 2 | 4 ГБ | 75% | ParallelGC | 2 |
Используйте следующие параметры JVM:
-XX:+UseParallelGC -XX:MaxRAMPercentage=75
Автоматическая настройка JVM с помощью средства запуска команд Azure для Java
В предыдущих разделах описывается, как выбрать флаги JVM вручную на основе памяти контейнера, ядер ЦП и типа рабочей нагрузки. Если вы не хотите поддерживать эти параметры самостоятельно, средство запуска команд Azure для Java (jaz) автоматически применяет значения по умолчанию JVM на основе облака.
Средство запуска команд Azure для Java — это упрощенная программа, которая находится между командой запуска и JVM. Он определяет облачное окружение, включая ограничения на объём памяти и использование ЦП для контейнера, а затем выбирает наиболее подходящие параметры настройки размера кучи, сборщика мусора (GC) и диагностики. Такой подход снижает издержки на настройку и повышает эффективность использования ресурсов из коробки.
Чтобы использовать инструмент, замените команду java на jaz в скрипте запуска или Dockerfile. Например, вместо настройки параметров JVM вручную:
java -XX:+UseParallelGC -XX:MaxRAMPercentage=75 -jar myapp.jar
Используйте jaz в следующих случаях:
jaz -jar myapp.jar
Средство включается в образы контейнеров для Microsoft Build of OpenJDK, поэтому дополнительная настройка не требуется. Следующий Dockerfile использует jaz, чтобы запустить Java-приложение из файла jar:
# Use any Microsoft Build of OpenJDK base image
FROM mcr.microsoft.com/openjdk/jdk:25-ubuntu
# Add your application.jar
COPY application.jar /application.jar
# Use jaz to launch your Java application
CMD ["jaz", "-jar", "application.jar"]
Параметры установки, поддерживаемые среды и сведения о конфигурации см. в разделе Azure средство запуска команд для Java.
Контейнеризация существующего локального приложения
Если приложение уже работает локально или на виртуальной машине в облаке, начните со следующей конфигурации:
- Тот же объем памяти, к которому в настоящее время имеется доступ к приложению.
- Одинаковое количество ЦП или виртуальных ЦП, которые в настоящее время доступны для приложения.
- Те же параметры JVM, которые вы используете в настоящее время.
Если сочетание количества ядер vCPU и объёма памяти контейнера недоступно, выберите ближайшую доступную комбинацию, округлив количество ядер vCPU и объём памяти контейнера в большую сторону.
Дальнейшие шаги
Теперь, когда вы понимаете общие рекомендации по контейнеризации приложений Java, перейдите к следующим статьям, чтобы установить базовый план контейнеризации и упростить настройку JVM: