Введение
Параметры JVM используются для настройки Java Virtual Machine (JVM), которая отвечает за выполнение Java-байткода. С помощью правильной настройки параметров JVM мы можем повысить производительность Java-приложений. В этом лабе мы узнаем, как установить некоторые часто используемые параметры JVM для оптимизации производительности Java-приложений.
Настройка памяти кучи
Куча памяти - это область данных во время выполнения, в которой выделяются Java-объекты. Мы можем установить размер кучи памяти с помощью параметров -Xmx и -Xms.
-Xmx<размер кучи>[единица]: задает максимальный размер кучи.-Xms<размер кучи>[единица]: задает начальный размер кучи.
Например, чтобы установить минимальный размер кучи в 512 МБ и максимальный размер кучи в 1 ГБ, мы можем использовать следующую команду:
java -Xms512m -Xmx1g MyApp
Выбор сборщиков мусора
Сбор мусора - это процесс освобождения памяти, занимаемой объектами, которые больше не используются Java-приложением. Выбор сборщика мусора может существенно повлиять на производительность приложения. JVM предоставляет несколько сборщиков мусора, каждый из которых имеет свои достоинства и недостатки.
-XX:+UseSerialGC: включает в работу последовательный сборщик мусора, который использует один поток для сбора мусора.-XX:+UseParallelGC: включает в работу параллельный сборщик мусора, который использует несколько потоков для сбора мусора.-XX:+UseParNewGC: включает в работу сборщик мусора с параллельным меткой и清扫ом (CMS), который использует несколько потоков для выполнения параллельного сбора мусора.-XX:+UseG1GC: включает в работу сборщик мусора Garbage-first (G1), который предназначен для обеспечения постоянного времени остановки и высокой пропускной способности.
Например, чтобы включить параллельный сборщик мусора, мы можем использовать следующую команду:
java -XX:+UseParallelGC MyApp
Логирование действий по сборке мусора
Логирование сборки мусора позволяет нам отслеживать производительность сборщика мусора и настраивать параметры сборщика мусора в соответствии с требованиями приложения. Мы можем использовать следующие параметры для включения логирования сборки мусора:
-XX:+UseGCLogFileRotation: включает вращение логов для журналов сборки мусора.-XX:NumberOfGCLogFiles=<количество файлов журнала>: ограничивает количество файлов журнала для журналов сборки мусора.-XX:GCLogFileSize=<размер файла><единица>: задает ограничение размера для журналов сборки мусора.-Xloggc:[путь к файлу gc.log]: задает путь для журналов сборки мусора.
Например, чтобы включить логирование сборки мусора и задать путь к файлу журнала /path/to/gc.log, мы можем использовать следующую команду:
java -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/path/to/gc.log MyApp
Обработка ошибки 'OutOfMemory'
Когда JVM 耗尽内存,它会抛出 "Недостаточно памяти" ошибку。我们可以使用以下 JVM 参数来处理此错误:
-XX:+HeapDumpOnOutOfMemoryError:当发生 "Недостаточно памяти" ошибка时,JVM 会将堆转储写入磁盘。-XX:HeapDumpPath=<путь к файлу дампа кучи>:指定堆转储文件的路径。-XX:OnOutOfMemoryError=<команда>:当发生 "Недостаточно памяти" ошибка时,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
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 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/path/to/gc.log HelloWorld
Это задает путь к файлу журнала /path/to/gc.log.
Компиляция и запуск Java-приложения с другими часто используемыми параметрами
Теперь давайте скомпилируем и запустим Java-приложение с параметрами -XX:+UseStringDeduplication и -XX:MaxHeapFreeRatio:
java -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=70 HelloWorld
Это включает дедупликацию строк и устанавливает максимальное соотношение свободного места в куче после сборки мусора в 70%.
Резюме
В этом практическом занятии мы узнали, как настраивать различные параметры JVM для оптимизации производительности Java-приложений. Мы узнали, как настраивать размер памяти кучи, выбирать сборщиков мусора, включать логирование сборки мусора, обрабатывать ошибки Out Of Memory, использовать 64-разрядный JVM и настраивать некоторые другие часто используемые параметры. Мы также узнали, как компилировать и запускать Java-приложение с параметрами JVM.



