Введение
Параметры JVM используются для настройки виртуальной машины Java (JVM), которая отвечает за выполнение байт-кода Java. Правильная настройка параметров JVM позволяет повысить производительность Java-приложений. В этой лабораторной работе мы научимся задавать часто используемые параметры JVM для оптимизации работы приложений.
Настройка памяти кучи (Heap Memory)
Память кучи — это область данных времени выполнения, в которой размещаются объекты Java. Мы можем задать размер кучи с помощью параметров -Xmx и -Xms.
-Xmx<heap size>[unit]: устанавливает максимальный размер кучи.-Xms<heap size>[unit]: устанавливает начальный размер кучи.
Например, чтобы установить минимальный размер кучи 512 МБ, а максимальный — 1 ГБ, можно использовать следующую команду:
java -Xms512m -Xmx1g MyApp
Выбор сборщиков мусора (Garbage Collectors)
Сборка мусора — это процесс освобождения памяти, занятой объектами, которые больше не используются Java-приложением. Выбор сборщика мусора может существенно повлиять на производительность приложения. JVM предоставляет несколько сборщиков мусора, каждый из которых имеет свои преимущества и недостатки.
-XX:+UseSerialGC: включает последовательный сборщик мусора, который использует один поток для сборки мусора.-XX:+UseParallelGC: включает параллельный сборщик мусора, который использует несколько потоков для сборки мусора.-XX:+UseParNewGC: включает сборщик мусора с конкурентной пометкой и очисткой (CMS), который использует несколько потоков для выполнения параллельной сборки мусора.-XX:+UseG1GC: включает сборщик мусора Garbage-first (G1), который разработан для обеспечения стабильного времени пауз и высокой пропускной способности.
Например, чтобы включить параллельный сборщик мусора, можно использовать следующую команду:
java -XX:+UseParallelGC MyApp
Логирование активности сборки мусора
Логирование сборки мусора позволяет отслеживать производительность сборщика и настраивать его параметры в соответствии с требованиями приложения. Мы можем использовать следующие параметры для включения логирования:
-Xlog:gc*: включает логирование сборки мусора в современных версиях Java.file=gc.log: записывает вывод лога в файл с именемgc.log.filecount=10: хранит до 10 ротируемых файлов логов.filesize=10M: ротирует файл лога после достижения им размера 10 МБ.
Например, чтобы включить логирование сборки мусора и сохранить лог в gc.log, можно использовать следующую команду:
java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M MyApp
Обработка ошибок нехватки памяти (Out of Memory)
Когда в JVM заканчивается память, она выбрасывает ошибку Out Of Memory Error. Мы можем использовать следующие параметры JVM для обработки этой ошибки:
-XX:+HeapDumpOnOutOfMemoryError: при возникновении ошибки нехватки памяти JVM запишет дамп кучи на диск.-XX:HeapDumpPath=<path to heap dump file>: указывает путь к файлу дампа кучи.-XX:OnOutOfMemoryError=<command>: при возникновении ошибки нехватки памяти JVM выполнит указанную команду.-XX:+UseGCOverheadLimit: JVM использует эту опцию для установки ограничения на время, затрачиваемое на сборку мусора.
Например, чтобы настроить JVM на запись дампа кучи в файл /path/to/heapdump.hprof при возникновении ошибки нехватки памяти, можно использовать следующую команду:
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof MyApp
Использование 64-битной JVM
Мы можем использовать параметр -d для выбора между 32-битной и 64-битной JVM. Например, чтобы использовать 64-битную JVM, можно применить следующую команду:
java -d64 MyApp
Компиляция и запуск Java-приложения с параметрами JVM
Давайте используем программу HelloWorld.java, чтобы скомпилировать и запустить Java-приложение с параметрами JVM, которые мы изучили ранее.
cd ~/project
touch HelloWorld.java
Введите следующий код:
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Сохраните файл и закройте его. Теперь скомпилируем и запустим код с параметром -Xmx:
javac HelloWorld.java
java -Xmx512m HelloWorld
Это устанавливает максимальный размер кучи на 512 МБ. Мы должны увидеть следующий вывод:
Hello, World!
Компиляция и запуск Java-приложения со сборщиками мусора
Теперь скомпилируем и запустим Java-приложение с параллельным сборщиком мусора:
java -XX:+UseParallelGC HelloWorld
Мы должны увидеть следующий вывод:
Hello, World!
Компиляция и запуск Java-приложения с логированием сборки мусора
Теперь скомпилируем и запустим Java-приложение с включенным логированием сборки мусора:
java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M HelloWorld
Это запишет логи сборки мусора в файл gc.log в текущей директории во время работы программы.
Компиляция и запуск Java-приложения с другими часто используемыми параметрами
Теперь скомпилируем и запустим Java-приложение с параметрами -XX:+UseStringDeduplication и -XX:MaxHeapFreeRatio:
java -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=70 HelloWorld
Это включает дедупликацию строк и устанавливает максимальное соотношение свободной памяти кучи после сборки мусора на уровне 70%.
Резюме
В этой лабораторной работе мы научились задавать различные параметры JVM для оптимизации производительности Java-приложений. Мы узнали, как настраивать размер памяти кучи, выбирать сборщики мусора, включать логирование сборки мусора, обрабатывать ошибки нехватки памяти, использовать 64-битную JVM и задавать другие часто используемые параметры. Мы также научились компилировать и запускать Java-приложение с параметрами JVM.



