← Назад к вопросам

Какие параметры командной строки можно передавать JVM при запуске Java приложения

1.7 Middle🔥 161 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Параметры командной строки JVM при запуске Java приложения

JVM поддерживает множество параметров для настройки памяти, производительности, отладки и поведения приложения. Понимание этих параметров критично для оптимизации production систем.

1. Основные параметры памяти

Heap память:

# Устанавливаем минимальный и максимальный размер heap
java -Xms512m -Xmx2g MyApplication

# Xms = начальный размер heap (минимум)
# Xmx = максимальный размер heap

# Хорошая практика: Xms == Xmx для production
java -Xms2g -Xmx2g MyApplication

Метаспейс (для метаданных классов):

# Java 8+: вместо PermGen используется Metaspace
java -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m MyApplication

# Это важно при динамической загрузке классов

Stack память:

# Размер стека для каждого потока
java -Xss1m MyApplication  # 1 мегабайт на поток

# По умолчанию 1MB, может быть важно при большом числе потоков

2. Garbage Collection параметры

Выбор GC алгоритма:

# G1GC (по умолчанию в Java 11+)
java -XX:+UseG1GC MyApplication

# ZGC (low-latency, Java 11+)
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApplication

# Parallel GC (хорошо для batch processing)
java -XX:+UseParallelGC MyApplication

# Serial GC (только для простых приложений)
java -XX:+UseSerialGC MyApplication

Настройка GC поведения:

# Максимальное время паузы (G1GC)
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 MyApplication

# Процент heap для young generation
java -XX:NewRatio=2 MyApplication  # Young = 1/3 heap, Old = 2/3

# Параллелизм сборки мусора
java -XX:ParallelGCThreads=8 MyApplication

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

Логирование GC:

# Java 9+
java -Xlog:gc:file=gc.log MyApplication

java -Xlog:gc*:file=gc.log:level=info:uptime,level,tags MyApplication

# Java 8
java -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log MyApplication

Мониторинг JVM:

# Включить удалённый мониторинг (JMX)
java -Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.port=9010 \
  -Dcom.sun.management.jmxremote.local.only=false \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  MyApplication

Профилирование:

# Вывести информацию о потоках при выходе
java -XX:+PrintCompilation MyApplication

# Флаг для профилирования
java -prof MyApplication

4. System Properties

Передача системных параметров:

# Параметры из командной строки (-D флаг)
java -Dapp.name=MyApp -Dapp.version=1.0 MyApplication

# В коде Java
String appName = System.getProperty("app.name");  // "MyApp"
String version = System.getProperty("app.version");  // "1.0"

Стандартные системные свойства:

public class SystemPropertiesExample {
    public static void printSystemProperties() {
        System.out.println("Java версия: " + 
            System.getProperty("java.version"));
        System.out.println("User dir: " + 
            System.getProperty("user.dir"));
        System.out.println("OS name: " + 
            System.getProperty("os.name"));
        System.out.println("Java home: " + 
            System.getProperty("java.home"));
    }
}

5. Параметры компиляции

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

# Уровень оптимизации (-XX:TieredStopAtLevel=4)
java -XX:+TieredCompilation \
  -XX:TieredStopAtLevel=4 \
  MyApplication

# Отключить JIT (только интерпретация)
java -Xint MyApplication

# Только компиляция (опасно на старте)
java -Xcomp MyApplication

Кэширование:

# Application Class Data Sharing (Java 10+)
java -Xshare:auto MyApplication

# Может улучшить скорость старта приложения

6. Параметры производительности

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

# Aggressive optimization
java -XX:+AggressiveOpts MyApplication

# Biased locking (по умолчанию on)
java -XX:+UseBiasedLocking MyApplication

# String deduplication (G1GC)
java -XX:+UseG1GC -XX:+UseStringDeduplication MyApplication

# Escape analysis (позволяет JVM оптимизировать allocations)
java -XX:+DoEscapeAnalysis MyApplication

7. Параметры безопасности

SecurityManager и permissions:

# Использовать security manager
java -Djava.security.manager=default MyApplication

# Файл с правами доступа
java -Djava.security.policy=file:/path/to/policy.txt MyApplication

Управление модулями (Java 9+):

# Экспортировать внутренние API
java --add-exports java.base/sun.nio.ch=ALL-UNNAMED MyApplication

# Разрешить доступ к internal классам
java --illegal-access=permit MyApplication

8. Параметры отладки и диагностики

Remote Debugging:

# Включить remote debugging на порту 5005
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 MyApplication

# suspend=y - ждёт подключения debugger'а перед стартом
# suspend=n - стартует сразу

Dump информация о приложении:

# Dump при OutOfMemoryError
java -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/tmp/heapdump.hprof \
  MyApplication

# Dump при выходе
java -XX:+PrintClassHistogram MyApplication

9. Практический пример: Production конфигурация

#!/bin/bash

# Стандартная production конфигурация для web сервера
java \
  -server \
  -Xms4g \
  -Xmx4g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+ParallelRefProcEnabled \
  -XX:+UnlockDiagnosticVMOptions \
  -XX:G1SummarizeRSetStatsPeriod=1 \
  -XX:+PrintGCDetails \
  -XX:+PrintGCTimeStamps \
  -Xloggc:logs/gc.log \
  -XX:+UseStringDeduplication \
  -Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.port=9010 \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -Dapp.name=MyService \
  -Dapp.version=1.0 \
  -jar myapp.jar

10. Параметры для микросервисов / контейнеров

# Контейнер-aware параметры (Java 10+)
java -XX:+UnlockExperimentalVMOptions \
  -XX:+UseCGroupMemoryLimitForHeap \
  MyApplication

# Явная настройка для Docker
java -XX:InitialHeapSize=512m \
  -XX:MaxHeapSize=512m \
  MyApplication

# Java 15+: более современный способ
java -XX:+UseContainerSupport \
  -XX:MaxRAMPercentage=50.0 \
  MyApplication

11. Чек-лист параметров JVM

✓ Память: -Xms, -Xmx (должны быть равны в production)
✓ GC: выбрать подходящий алгоритм (G1GC для большинства)
✓ Лог GC: -Xlog:gc или -XX:+PrintGCDetails для отладки
✓ Мониторинг: включить JMX для production
✓ Отладка: -agentlib:jdwp для development
✓ Properties: -D для конфигурации приложения
✓ Security: -Djava.security.manager если нужно
✓ Производительность: включить доступные оптимизации

12. Как узнать текущие параметры JVM

# Вывести все JVM параметры
java -XshowSettings:all -version

# Вывести только VM параметры
java -XshowSettings:vm -version

# В Java коде
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMXBean.getInputArguments();
arguments.forEach(System.out::println);

Правильная настройка параметров JVM может значительно улучшить производительность, надёжность и масштабируемость приложения.

Какие параметры командной строки можно передавать JVM при запуске Java приложения | PrepBro