Java for Beginner
674 subscribers
554 photos
156 videos
12 files
845 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
В рамках дополнительной информации, устраняем пробел в знаниях по настройке поведения JVM.

Управление JVM (Java Virtual Machine) командами

Управление JVM (Java Virtual Machine) командами — это процесс конфигурации работы JVM через параметры, которые передаются при её запуске. Эти параметры позволяют настраивать поведение JVM, включая управление памятью, настройку сборщика мусора, логирование, отладку и безопасность. Все параметры JVM можно разделить на несколько категорий.

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

1.1. Стандартные параметры
Эти параметры поддерживаются всеми JVM и не зависят от конкретной реализации.

Например:
-cp или -classpath — указывает путь к классам и JAR-файлам.
-Dproperty=value — установка пользовательских системных свойств.
-version — выводит версию
JVM.
-help — показывает справку по основным параметрам
JVM.

Пример:
java -cp myapp.jar -Dconfig.file=app.properties com.example.Main


1.2. Параметры для настройки памяти

Эти параметры позволяют управлять распределением памяти в JVM:
-Xms<size> — начальный размер кучи (heap).
-Xmx<size> — максимальный размер кучи.
-Xss<size> — размер стека для каждого потока.
-XX:MetaspaceSize=<size> — начальный размер метапространства (метаданных классов).
-XX:MaxMetaspaceSize=<size> — максимальный размер метапространства.


Пример:
java -Xms512m -Xmx2g MyApp


1.3. Расширенные параметры (-X и -XX)

Эти параметры специфичны для реализации JVM (обычно HotSpot) и предоставляют дополнительные возможности:
-X параметры: упрощённые параметры, поддерживаемые большинством JVM.
-Xdebug — включает отладку.
-Xloggc:<file> — логирование работы сборщика мусора в файл.
-XX параметры: детальные настройки и эксперименты.
-XX:+UseG1GC — использование сборщика мусора G1.
-XX:ParallelGCThreads=<n> — количество потоков для параллельной сборки мусора.
-XX:+PrintGCDetails — выводит информацию о работе GC.
-XX:+HeapDumpOnOutOfMemoryError — создаёт дамп памяти при переполнении.


Пример:
java -XX:+UseG1GC -XX:+PrintGCDetails -XX:MaxHeapFreeRatio=70 MyApp


1.4. Логирование и диагностика

Эти параметры помогают анализировать производительность и поведение JVM:
-verbose:class — выводит информацию о загрузке классов.
-verbose:gc — выводит информацию о работе сборщика мусора.
-Xlog — гибкое управление логированием (начиная с Java 9).
Пример: -Xlog:gc* для логирования всех событий, связанных с GC.
-XX:+UnlockDiagnosticVMOptions — включает диагностические параметры.
Например: -XX:+PrintCompilation — выводит информацию о компиляции JIT.


Пример:
java -Xlog:gc* MyApp


1.5. Параметры безопасности
-Djava.security.manager — включает менеджер безопасности.
-Djava.security.policy=<file> — указывает путь к файлу политики безопасности.


2. Распределение памяти и работа GC

2.1. Память JVM

JVM делит память на несколько областей:
Heap (куча): для объектов.
Metaspace: для метаданных классов (начиная с Java 8).
Stack: для хранения вызовов методов и локальных переменных.
Native Memory: для работы
JVM вне управляемой памяти.

2.2. Управление сборщиком мусора (GC)

Выбор GC сильно влияет на производительность:
-XX:+UseSerialGC — однопоточный сборщик мусора.
-XX:+UseParallelGC — многопоточный, ориентирован на максимальную пропускную способность.
-XX:+UseG1GC — G1 (Garbage-First) для больших приложений.
-XX:+UseZGC — Z Garbage Collector для низкой задержки (Java 11+).
-XX:+UseShenandoahGC — Shenandoah для низкой задержки (Java 12+).


3. Управление через команды операционной системы


Помимо параметров JVM, можно использовать команды ОС для управления процессом:
jps — список запущенных JVM.
jstat — статистика памяти и GC.
jmap — информация о памяти (heap dump).
jstack — вывод стека потоков.
jcmd — универсальный инструмент управления
JVM.

4. Советы и рекомендации

Используйте флаги -Xlog вместо устаревших -verbose:gc в современных версиях Java.
Настройка памяти (-Xms и -Xmx) должна учитывать нагрузку приложения.
Анализируйте дампы памяти для отладки утечек.
Включайте диагностику (-XX:+UnlockDiagnosticVMOptions) только для тестирования.


#Java #Training #Medium #JVM_Commands
Продолжаем устранять пробелы по управлению JVM командами.

1. Компиляция программ Java

Для компиляции используется команда javac, которая превращает исходный код (.java) в байт-код (.class).

1.1. Основной синтаксис

javac [опции] <файлы.java>


1.2. Основные параметры
-d <директория> — указывает каталог для выходных файлов .class.
javac -d out src/com/example/MyClass.java


-classpath или -cp — задаёт путь к используемым классам и библиотекам.
javac -cp libs/mylib.jar MyProgram.java


-source <версия> — задаёт версию языка Java для исходного кода.
javac -source 11 MyProgram.java


-target <версия> — указывает целевую версию
JVM, для которой будет скомпилирован байт-код.
javac -source 11 -target 8 MyProgram.java


-encoding <кодировка> — кодировка исходных файлов (например, UTF-8).
javac -encoding UTF-8 MyProgram.java


-verbose — выводит дополнительную информацию о процессе компиляции.

2. Запуск программы

Для запуска скомпилированного кода используется команда java, которая запускает JVM и исполняет байт-код.

2.1. Основной синтаксис
java [опции] <имя_класса> [аргументы]


2.2. Основные параметры
-classpath или -cp — задаёт путь к классам и библиотекам.
java -cp out:libs/mylib.jar com.example.MyClass


-D<ключ>=<значение> — задаёт системное свойство, доступное через System.getProperty().
java -Dconfig.file=app.properties com.example.MyClass


-X и -XX параметры — для настройки JVM (управление памятью, GC и т.д.).
--enable-preview — включает поддержку экспериментальных функций (начиная с Java 12).

Пример запуска:
java -Xmx2g -cp out:libs/mylib.jar com.example.MainClass arg1 arg2


3. Утилиты для работы с классами

3.1. jar
Утилита для создания, просмотра и распаковки JAR-архивов.

3.1.1. Создание JAR-файла
jar cf myapp.jar -C out .


Здесь:
c — создать JAR.
f — имя выходного файла.
-C <путь> — указать корневую директорию классов.


3.1.2. Просмотр содержимого JAR
jar tf myapp.jar


3.1.3. Добавление манифеста

Манифест определяет точку входа в приложение:
jar cfe myapp.jar com.example.MainClass -C out .


Флаг e указывает класс с методом public static void main(String[] args).

3.2. javadoc
Генерация HTML-документации из Java-комментариев.

Пример:
javadoc -d docs -sourcepath src -subpackages com.example


3.3. javap
Дизассемблер для классов Java.

Пример:
javap -c com.example.MyClass


Флаг -c выводит байт-код методов.

3.4. jdeps
Инструмент для анализа зависимостей классов.

Пример:
jdeps -summary myapp.jar


4. Утилиты для анализа и отладки

4.1. jdb
Отладчик Java. Используется для пошаговой отладки приложения.

Пример запуска:
jdb -classpath out com.example.MainClass


Команды внутри jdb:
stop at com.example.MainClass:15 — установить точку останова на 15-й строке.
run — запустить программу.
step — выполнить следующую строку.


4.2. Инструменты мониторинга JVM
jps — выводит список всех работающих JVM.
jps -v


jstat — статистика памяти и GC.
jstat -gc <pid>


jmap — информация о памяти, снимки heap.
jmap -heap <pid>


jstack — вывод стека потоков.
jstack <pid>


jcmd — универсальная утилита управления JVM.
jcmd <pid> VM.uptime


5. Пример полного цикла работы

Компиляция:
javac -d out -sourcepath src src/com/example/MainClass.java


Создание JAR:
jar cfe myapp.jar com.example.MainClass -C out .


Запуск:
java -cp myapp.jar com.example.MainClass


Мониторинг:
jps
jstat -gc <pid>
jmap -heap <pid>


#Java #Training #Medium #JVM_Commands
И еще немного про команды в JVM

1. Основные специальные символы

1.1. Символ * (звёздочка)
Используется для подстановки любого количества символов.
Применяется для работы с несколькими файлами.

javac src/com/example/*.java
Этот пример компилирует все файлы .java в указанной директории.


1.2. Символ ?
Подставляет любой один символ.
javac src/com/example/Fi?e.java
Компилирует файлы, чьи имена начинаются с Fi, заканчиваются на e и содержат один символ между ними (например, File.java, Fike.java).


1.3. Символы > и >>
>: перенаправляет вывод в файл, заменяя его содержимое.
>>: перенаправляет вывод в файл, добавляя данные в конец.

java -Xlog:gc > gc.log
Записывает логи сборщика мусора в файл gc.log, перезаписывая его содержимое.


java -Xlog:gc >> gc.log
Добавляет новые логи в конец файла gc.log.


1.4. Символ <
Перенаправляет ввод из файла.
java com.example.MyClass < input.txt
Передаёт содержимое файла input.txt как стандартный ввод для программы.


1.5. Символы | и &&
|: перенаправляет вывод одной команды на вход другой.
&&: выполняет следующую команду только если предыдущая завершилась успешно.

java com.example.MyClass | grep "Error"
Передаёт вывод программы в команду grep, которая фильтрует строки, содержащие Error.


javac MyClass.java && java MyClass
Компилирует MyClass.java и, если компиляция прошла успешно, запускает программу.


1.6. Символ &
Запускает процесс в фоновом режиме.
java com.example.MyClass &
Запускает программу в фоновом режиме, позволяя продолжать вводить команды.


1.7. Кавычки (", ', `)

Кавычки используются для обработки пробелов, спецсимволов и выполнения команд внутри строки.

Двойные кавычки ("): сохраняют пробелы, но позволяют интерполяцию переменных.
java -Dpath="C:\My Folder"


Одинарные кавычки ('): игнорируют интерполяцию переменных и спецсимволов.
java -Dpath='C:\My Folder'


Обратные кавычки (`): выполняют команду и подставляют её вывод.
java -Dtime=`date`


1.8. Символы []
Указывают диапазоны символов для подстановки.
javac src/[a-c]*.java
Компилирует все файлы, начинающиеся с букв a, b или c.


2. Пример комбинирования специальных символов

javac src/com/example/*.java && java -cp src com.example.Main > output.log


Этот пример:
Компилирует все файлы .java в указанной директории.
Если компиляция успешна, запускает класс Main.
Записывает вывод программы в файл output.log.


3. Особенности в разных ОС


Windows (CMD):

Некоторые символы требуют экранирования с помощью ^:
java -Dpath="C:\My^ Folder"


В PowerShell используется обратный апостроф (`) для экранирования:
java -Dpath="C:\My` Folder"


Linux и MacOS (Bash, Zsh):
Используются стандартные символы, такие как \ для экранирования.
java -Dpath="C:\My\ Folder"


4. Полезные советы

Если необходимо передать символы буквально (например, *, ?, или $), экранируйте их с помощью \:
java -Dspecial=\* com.example.Main


Используйте кавычки для обработки путей с пробелами:
javac -cp "lib/some library.jar" MyClass.java


#Java #Training #Medium #JVM_Commands