Рубрики
Без рубрики

Инструменты командной строки для определения размера кучи Java

Узнайте, как использовать инструменты командной строки для определения размера кучи запущенного Java-приложения.

Автор оригинала: Mona Mohamadinia.

1. Обзор

В этом кратком руководстве мы познакомимся с несколькими различными способами получения размера кучи запущенного Java-приложения.

2. jcmd

Чтобы найти информацию о куче и метапространстве запущенного Java-приложения, мы можем использовать утилиту командной строки jcmd :

jcmd  GC.heap_info

Во-первых, давайте найдем идентификатор процесса конкретного Java-приложения с помощью команды jps |:

$ jps -l
73170 org.jetbrains.idea.maven.server.RemoteMavenServer36
4309  quarkus.jar
12070 sun.tools.jps.Jps

Как показано выше, идентификатор процесса для нашего приложения Кварков равен 4309. Теперь, когда у нас есть идентификатор процесса, давайте посмотрим информацию о куче:

$ jcmd 4309 GC.heap_info
4309:
 garbage-first heap   total 206848K, used 43061K
  region size 1024K, 43 young (44032K), 3 survivors (3072K)
 Metaspace       used 12983K, capacity 13724K, committed 13824K, reserved 1060864K
  class space    used 1599K, capacity 1740K, committed 1792K, reserved 1048576K

Это приложение использует алгоритм G1 или garbage-first GC:

  • Первая строка сообщает текущий размер кучи как 202 МБ (206848 К) – также используется 42 МБ (43061 К)
  • Регионы G1 имеют размер 1 МБ, 43 региона отмечены как молодые, а 3-как выжившие.
  • Текущая емкость метапространства составляет около 13,5 МБ (13724 К). Из этих 13,5 МБ используется около 12,5 МБ (12983 К). Кроме того, мы можем иметь до 1 ГБ метапространства (1048576 K). Кроме того, 13842 КБ гарантированно будут доступны для использования виртуальной машиной Java, также известной как выделенная память
  • Последняя строка показывает, какая часть метапространства используется для хранения информации о классе

Этот вывод может изменяться в зависимости от алгоритма GC . Например, если мы запустим одно и то же приложение Quarks с помощью ZGC via “-XX:+UnlockExperimentalVMOptions-XX:+UseZGC” :

ZHeap           used 28M, capacity 200M, max capacity 1024M
Metaspace       used 21031K, capacity 21241K, committed 21504K, reserved 22528K

Как показано выше, мы используем 28 МБ кучи и около 20 МБ метапространства. На момент написания этой статьи Intellij IDEA все еще использует CMS GC со следующей информацией о куче:

par new generation   total 613440K, used 114299K
  eden space 545344K,  18% used
  from space 68096K,  16% used
  to   space 68096K,   0% used
 concurrent mark-sweep generation total 1415616K, used 213479K
 Metaspace       used 423107K, capacity 439976K, committed 440416K, reserved 1429504K
  class space    used 55889K, capacity 62488K, committed 62616K, reserved 1048576K

Мы можем обнаружить классическую поколенческую природу CMS GC в конфигурации кучи.

3. j stat

В дополнение к jcmd мы можем использовать jstat | для получения той же информации из запущенных приложений. Например, мы можем использовать jstat-gc для просмотра статистики кучи:

$ jstat -gc 4309
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     
0.0    0.0    0.0    0.0   129024.0  5120.0   75776.0    10134.6   20864.0
MU      CCSC   CCSU     YGC     YGCT    FGC    FGCT     CGC    CGCT     GCTGCT
19946.2 2688.0 2355.0    2      0.007    1      0.020    0     0.000     0.027

Каждый столбец представляет объем памяти или использование определенной области памяти:

  • S0C — Емкость для первого выжившего пространства
  • S1C — Емкость для второго выжившего пространства
  • S0U — Используемое пространство первого выжившего
  • S1U — Используемое пространство второго выжившего
  • Космическая емкость EC — Eden
  • ЕС — Используемое пространство из Эдема
  • OC — Мощность старой генерации
  • OU — Используемое пространство от Старого поколения
  • Емкость MC — Metaspace
  • MU — Используемое пространство из Метапространства
  • CCSC — Объем пространства сжатого класса
  • CCSU — Используемое пространство для сжатых классов
  • YGC — Количество второстепенных GCS
  • YGCT — Время, затраченное на незначительные GCS
  • FGC — Количество полных ГКС
  • FGCT — Время, затраченное на полный GCs
  • CGC — Количество одновременных GCS
  • CGCT — Время, затраченное на параллельные GCS
  • GCT — Время, затраченное на все GCS

Существуют и другие параметры, связанные с памятью для jstat , такие как:

  • -gccapacity для сообщения о различных емкостях для различных областей памяти
  • Параметр -gcutil показывает только процент использования каждого региона
  • -gccause совпадает с -gcutil , но добавляет причину последних событий GC и, возможно, текущих событий GC

4. Args Командной Строки

Если мы запускаем Java-приложение с параметрами конфигурации кучи (например,- Xms и-Xmx ), то есть несколько других трюков, чтобы найти указанные значения.

Например, вот как jps сообщает эти значения:

$ jps -lv
4309 quarkus.jar -Xms200m -Xmx1g

При таком подходе мы можем найти только эти статические значения. Таким образом, нет никакого способа узнать, скажем, о текущей зафиксированной памяти .

В дополнение к jps несколько других инструментов сообщат то же самое. Например, “jcmd VM.command_line” также сообщит эти сведения:

$ jcmd 4309 VM.command_line
4309:
VM Arguments:
jvm_args: -Xms200m -Xmx1g
java_command: quarkus.jar
java_class_path (initial): quarkus.jar
Launcher Type: SUN_STANDARD

Кроме того, в большинстве Unix-систем мы можем использовать ps | из пакета procps :

$ ps -ef | grep quarkus
... java -Xms200m -Xmx1g -jar quarkus.jar

Наконец, в Linux мы можем использовать виртуальную файловую систему /proc и ее pid-файлы:

$ cat /proc/4309/cmdline
java -Xms200m -Xmx1g -jar quarkus.jar

Файл cmdline в каталоге, названном в честь pid Кварков, содержит запись командной строки для приложения.

5. Заключение

В этом кратком руководстве мы рассмотрели несколько различных способов получения размера кучи запущенного Java-приложения.