Инструмент командной строки для определения размера кучи Java и используемой памяти (Linux)?

Есть ли инструмент командной строки (Linux) для проверки размера кучи (и используемой памяти) Java-приложения?

Я пробовал через jmap. Но это дает информацию. насчет областей внутренней памяти, таких как Eden / PermGen и т. д., которые мне не нужны.

Я ищу что-то вроде:

  • Максимальный объем памяти: 1 ГБ
  • Минимальная память: 256 МБ
  • Память кучи: 700 МБ
  • Используемая память: 460 МБ

Это все. Я знаю, что вижу это в JConsole и т. Д., Но мне нужен инструмент командной строки (не могу включить JMX и т. Д.)

Вы знаете какой-нибудь такой инструмент / команду?


person Jasper    schedule 09.10.2012    source источник


Ответы (18)


У каждого процесса Java есть pid, который вам сначала нужно найти с помощью команды jps.

Когда у вас есть pid, вы можете использовать jstat -gc [insert-pid-here] для поиска статистики поведения кучи, собранной со сбором мусора.

  • jstat -gccapacity [insert-pid-here] представит информацию о создании пула памяти и возможностях пространства.

  • jstat -gcutil [insert-pid-here] представит использование каждого поколения в процентах от его мощности. Полезно, чтобы получить представление об использовании.

См. jstat docs на сайте Oracle.

person farmer1992    schedule 09.10.2012
comment
Есть ли рекомендация, какие параметры jstat следует использовать, чтобы проверить только общее использование памяти JVM? Допустим, вы запускаете JVM с Xms=4g и Xmx=4g и хотите увидеть, сколько памяти уже использовано? - person basZero; 05.02.2014
comment
jstat -gcutil ‹pid› 250 N был очень полезен, чтобы взять N выборок с интервалами 250 мс и отобразить результат в виде процентов для соответствующих пробелов. Спасибо. - person Kerem; 14.03.2015
comment
awk 'print {$3+$4+$6+$8}' может печатать сводные данные об использовании в столбцах jstat Java 8. - person cybersoft; 01.02.2017
comment
Были проблемы с другими ответами, но базовый ps -ef | grep java показал мне аргументы vm, которые в моем случае включали значение -Xmx, что было всем, что мне было нужно. - person xdhmoore; 24.10.2017
comment
@cybersoft должно быть awk '{print $3+$4+$6+$8}' - person linehrr; 15.04.2019
comment
а также это должно быть awk '{print $3+$9}' или NGC + OGC, если мы не рассматриваем перманентное пространство. - person linehrr; 15.04.2019
comment
или awk 'NR>1 {print $3+$4+$6+$8}', чтобы пропустить первую строку с заголовками столбцов - person arberg; 04.09.2019

Эта команда показывает настроенные размеры кучи в байтах.

java -XX:+PrintFlagsFinal -version | grep HeapSize

Он также работает с Amazon AMI на EC2.

person Atma    schedule 01.03.2014
comment
Это не отвечает на вопрос, который конкретно спрашивает, как проверить использование кучи процессом. Команда здесь перечисляет значения JVM по умолчанию для всех процессов. - person Madbreaks; 30.11.2016
comment
Тем не менее, это очень полезный ответ для меня, когда я перехожу на эту страницу через поиск в Google о том, как найти глобальный размер кучи. - person Johan; 25.01.2018
comment
@jumping_monkey не косвенный, неверный. Если то, что вы говорите, правда, ответ следует отредактировать или вы можете добавить новый ответ. - person Madbreaks; 20.12.2019
comment
Заголовок первоначального вопроса достаточно двусмысленен, чтобы он оставался перечисленным ответом. Кроме того, это наиболее доступный ответ на вопрос о конфигурации в Google. - person John Haberstroh; 09.06.2021

jvmtop - это инструмент командной строки, который обеспечивает просмотр в реальном времени нескольких показателей, включая кучу.

Пример вывода режима обзора ВМ:

 JvmTop 0.3 alpha (expect bugs)  amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46
person MRalwasser    schedule 07.04.2013
comment
Это действительно отличный инструмент, вроде htop, но с показателями из jstat. Спасибо за предложение, @MRalwasser. - person oski86; 06.05.2015
comment
работает только до java 8 из-за зависимости tools.jar - person cdalxndr; 21.01.2021

Попробуйте, это сработало в Ubuntu и RedHat:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Для Windows:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Для Mac

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

Вывод всех этих команд похож на вывод ниже:

uintx InitialHeapSize                          := 20655360        {product}
uintx MaxHeapSize                              := 331350016       {product}
uintx PermSize                                  = 21757952        {pd product}
uintx MaxPermSize                               = 85983232        {pd product}
intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)

Чтобы найти размер в МБ, разделите значение на (1024 * 1024).

person padippist    schedule 04.08.2016
comment
Как найти использование памяти, разделенное кучей, permsize, ... конкретного java-процесса с помощью pid? - person Gary Gauh; 17.01.2017
comment
@GaryGauh Это размер кучи по умолчанию. Чтобы найти использование запущенного приложения, вы должны сделать это в коде или использовать jconsole. Я знаю, что должно быть много других способов. - person padippist; 18.01.2017
comment
Используйте jstat -gc <vmid> для запуска приложений. - person Micha Wiedenmann; 03.07.2018

Без использования JMX, который используется в большинстве инструментов, все, что вы можете сделать, это использовать

jps -lvm

и сделайте вывод, что настройки будут из параметров командной строки.

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

Кстати: я предпочитаю использовать VisualVM, а не JConsole.

person Peter Lawrey    schedule 09.10.2012

Существует инструмент командной строки с визуальным аспектом - jvm-mon. Это инструмент мониторинга JVM для командной строки, который выводит:

  • использование кучи, размер и макс.
  • jvm процессы
  • использование процессора и GC
  • верхние темы

Показатели и диаграммы обновляются, пока инструмент открыт.

Пример: jvm-mon

person Andrejs    schedule 17.02.2017
comment
Отметим, что jvm-mon работает только для Java8. - person tmanolatos; 21.09.2017
comment
^ Есть новая версия, которая теперь также поддерживает Java 11. - person Andrejs; 09.05.2020

Поздно на вечеринке, но очень простое решение - использовать скрипт jpsstat.sh. Он предоставляет простую информацию о текущей памяти, максимальном объеме памяти и использовании процессора.

  • Перейдите в проект GitHub и загрузите файл jpsstat.sh.
  • Щелкните правой кнопкой мыши jpsstat.sh, перейдите на вкладку разрешения и сделайте его исполняемым
  • Теперь запустите сценарий, используя следующую команду ./jpsstat.sh.

Вот пример вывода скрипта -

=====  ======  =======  =======  =====
 PID    Name   CurHeap  MaxHeap  %_CPU
=====  ======  =======  =======  =====
2777   Test3      1.26     1.26    5.8
2582   Test1      2.52     2.52    8.3
2562   Test2      2.52     2.52    6.4
person amarjeetAnand    schedule 03.09.2017
comment
не работает из коробки в SUSE Linux (строка 38: declare: -A: invalid option) - person Chris; 31.10.2017
comment
звучит так, как будто вы получаете ошибку в объявлении ассоциативного массива, для которого требуется bash ›= 4. Также другая проблема может быть связана с запуском сценария как sh jpsstat.sh. Если да, попробуйте запустить сценарий как ./jpsstat.sh. - person amarjeetAnand; 31.10.2017
comment
Спасибо! Простой и просто потрясающий инструмент для быстрого устранения неполадок. Должен иметь! - person Vladimir Filipchenko; 04.12.2020
comment
@amarjeetAnand, какие единицы измерения currHead и maxHeap используются по умолчанию? Есть ли способ получить эти единицы в мегабайтах или в единицах, определяемых пользователем? - person Suryaprakash Pisay; 22.02.2021

Начиная с Java8 и более поздних версий, вы можете использовать следующую команду:

jcmd JAVA_PROCESS_ID GC.heap_info

Вы можете ссылаться на сумму, общий объем и использованную память из вывода.

Sample Command And Output: jcmd 9758 GC.heap_info

PSYoungGen  total 1579520K, used 487543K [0x0000000751d80000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 1354240K, 36% used [0x0000000751d80000,0x000000076f99dc40,0x00000007a4800000)
  from space 225280K, 0% used [0x00000007b2400000,0x00000007b2400000,0x00000007c0000000)
  to   space 225280K, 0% used [0x00000007a4800000,0x00000007a4800000,0x00000007b2400000)
ParOldGen       total 3610112K, used 0K [0x0000000675800000, 0x0000000751d80000, 0x0000000751d80000)
  object space 3610112K, 0% used [0x0000000675800000,0x0000000675800000,0x0000000751d80000)
Metaspace       used 16292K, capacity 16582K, committed 16896K, reserved 1064960K
  class space    used 1823K, capacity 1936K, committed 2048K, reserved 1048576K

Для получения дополнительных сведений о команде jcmd перейдите по ссылке здесь

person vaibhav gupta    schedule 31.12.2018
comment
Вам необходимо исправить свой комментарий. GC.heap_info доступен в Java 9 и выше. Это недоступно в Java 8. См. Другой поток здесь: stackoverflow.com/questions/41891127/ - person Pavel Molchanov; 08.03.2019
comment
@PavelMolchanov Я могу использовать команду в jdk1.8.0_172. /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/bin/jcmd 98270 GC.heap_info. Пожалуйста, если вы можете, добавьте информацию в упомянутую ветку, так как на данный момент у меня недостаточно репутации, чтобы добавить туда комментарий. - person vaibhav gupta; 19.03.2019
comment
Вы пользуетесь Mac? Вы используете Oracle JDK? Я не знаю, как это может быть доступно в вашем jdk1.8.0_172, Oracle задокументировала эту функцию только в Java 9 и выше: docs.oracle.com/javase/9/tools/jcmd.htm. Этого нет в документации Oracle JDK для Java 8. Это не упоминается в приведенной вами ссылке внизу: docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/ - person Pavel Molchanov; 19.03.2019
comment
Еще один вопрос. Пожалуйста, проверьте версию JDK, в которой выполняется процесс 98270 в вашем примере. jcmd получает доступные команды от JVM процесса (в вашем случае 98270). Если процесс 98270 выполняется с другим JDK (JDK 9 или выше), вы увидите, что команда GC.heap_info, доступная даже в самом JCMD, взята из Java 8. Доступные команды могут отличаться для разных процессов. Чтобы получить доступные команды, выполните: jcmp ‹PID› help. - person Pavel Molchanov; 19.03.2019
comment
Да, я использую Mac. (Не могли бы вы сообщить мне, как это может иметь значение). Да, я думаю, что использую oracle jdk (можете ли вы помочь мне узнать, какие еще доступны и как я могу проверить). Процесс использует jdk1.8.0_172 (проверено на нескольких java-процессах). У меня есть 5 дополнительных команд, чем описано в моей указанной ссылке, в справке jcmd ‹PID› - ›VM.classloader_stats, GC.rotate_log, GC.finalizer_info, GC.heap_info, VM.dynlibs - person vaibhav gupta; 21.03.2019
comment
FWIW, GC.heap_info также определенно доступен в OpenJDK 8. Может только в последних версиях? Я использую этот: 8u191-b12-2ubuntu0.18.04.1 - person Per Lundberg; 25.09.2019
comment
Интересно то, что я проверил, есть ли GC.heap_info в 1.8.0_101-b13, но не в 1.8.0_144-b01. - person devildelta; 15.04.2021

В моем случае мне нужно было проверить флаги внутри контейнера докеров, в котором не было большинства основных утилит (ps, pstree ...)

Используя jps, я получил PID запущенной JVM (в моем случае 1), а затем с jcmd 1 VM.flags я получил флаги от запущенной JVM.

Это зависит от того, какие команды у вас есть, но это может кому-то помочь. :)

person froblesmartin    schedule 13.09.2019

Любой подход должен дать вам примерно такое же число. Всегда рекомендуется выделять кучу с использованием -X..m -X..x для всех поколений. Затем вы можете гарантировать, а также выполнить ps, чтобы увидеть, какие параметры были переданы и, следовательно, используются.

Для фактического использования памяти вы можете примерно сравнить VIRT (выделенный и общий) и RES (фактически используемый) со значениями jstat:

Для Java 8 см. Эти значения в jstat. на самом деле имею в виду. Предполагая, что вы запускаете простой класс без mmap или обработки файлов.

$ jstat -gccapacity 32277
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
215040.0 3433472.0  73728.0  512.0  512.0  67072.0   430080.0  6867968.0   392704.0   392704.0      0.0 1083392.0  39680.0      0.0 1048576.0   4864.0   7225     2
$ jstat -gcutil 32277
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  6.25   0.00   7.96  18.21  98.01  95.29   7228   30.859     2    0.173   31.032

Макс:

     NGCMX + S0C + S1C + EC    + OGCMX   + MCMX    + CCSMX
   3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB

(примерно близко и ниже к памяти VIRT)

Макс (мин., использованный):

215040 + 512 + 512 + 67072 + 430080  + 39680    +  4864  = ~ 1GB

(примерно близко к памяти RES)

«Не цитируйте меня по этому поводу», но память VIRT примерно равна или превышает максимальный размер выделенной памяти, но пока используемая память свободна / доступна в физической памяти, JVM не генерирует исключение памяти. . Фактически, максимальный объем памяти даже не сравнивается с физической памятью при запуске JVM, даже если свопинг отключен в ОС. Лучшее объяснение того, какая виртуальная память действительно используется процессом Java, обсуждается здесь.

person kisna    schedule 06.03.2018

Что касается размера кучи Java, в Linux вы можете использовать

ps aux | grep java

or

ps -ef | grep java

и найдите -Xms, -Xmx, чтобы узнать указанный начальный и максимальный размер кучи.

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

java -XX:+PrintFlagsFinal -version | grep HeapSize

или конкретный jvm, например,

/path/to/jdk1.8.0_102/bin/java -XX:+PrintFlagsFinal -version | grep HeapSize

и найдите InitialHeapSize и MaxHeapSize в байтах.

person Yuci    schedule 08.12.2016

Сначала получите идентификатор процесса, первое число из перечисленного процесса, из одного из следующих: (или просто используйте ps aux | grep java, если хотите)

jps -lvm

Затем используйте здесь идентификатор процесса:

jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
person sjas    schedule 11.06.2017

Использование команды top - самый простой способ проверить использование памяти программой. Столбец RES показывает реальную физическую память, занятую процессом.

В моем случае у меня был файл размером 10g, прочитанный в java, и каждый раз я получал исключение outOfMemory. Это произошло, когда значение в столбце RES достигло значения, установленного в опции -Xmx. Затем, увеличив память с помощью опции -Xmx, все прошло нормально.

person M. Mashaye    schedule 15.12.2015
comment
Команда top показывает, сколько ОС отдано JVM. эти ребята спрашивают, как мы можем увидеть использование пространства кучи внутри JVM. JVM использует 10g, это не означает, что реальное пространство кучи заполнено данными 10g, потому что jvm почти никогда не возвращает память обратно в ОС из кучи, пока вы не завершите процесс. - person linehrr; 02.12.2017

До сих пор не существовало такого инструмента для печати кучи памяти в формате, который вы запрашивали Единственный и единственный способ распечатать - это написать Java-программу с помощью Runtime Class ,

public class TestMemory {

public static void main(String [] args) {

    int MB = 1024*1024;

    //Getting the runtime reference from system
    Runtime runtime = Runtime.getRuntime();

    //Print used memory
    System.out.println("Used Memory:" 
        + (runtime.totalMemory() - runtime.freeMemory()) / MB);

    //Print free memory
    System.out.println("Free Memory:" 
        + runtime.freeMemory() / mb);

    //Print total available memory
    System.out.println("Total Memory:" + runtime.totalMemory() / MB);

    //Print Maximum available memory
    System.out.println("Max Memory:" + runtime.maxMemory() / MB);
}

}

ссылка: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-java-runtime/

person Gowtham Prasath    schedule 22.06.2019

jcmd

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

jcmd  GC.heap_info

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

$ jps -l
73170 org.jetbrains.idea.maven.server.RemoteMavenServer36
4309  quarkus.jar

Как показано выше, идентификатор процесса для нашего приложения Quarkus - 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
12070 sun.tools.jps.Jps

Надеюсь, это поможет :)

person aslan13    schedule 05.06.2021

Если вы используете jrockit, попробуйте инструмент командной строки jrcmd. Например:

$ jrcmd 5127 print_memusage
5127:
Total mapped                  1074596KB           (reserved=3728KB)
-              Java heap       786432KB           (reserved=0KB)
-              GC tables        26316KB          
-          Thread stacks        13452KB           (#threads=34)
-          Compiled code         9856KB           (used=9761KB)
-               Internal          840KB          
-                     OS        15036KB          
-                  Other       146632KB          
-        Java class data        75008KB           (malloced=74861KB #103221 in 18709 classes)
- Native memory tracking         1024KB           (malloced=102KB #8)

Для дополнительных команд, таких как heap_diagnostics, используйте "jrcmd help", чтобы перечислить их.

https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t

person guest    schedule 17.05.2013

jstat -gccapacity javapid  (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex.  stat -gccapacity 28745 550 10 )

Пример O / P приведенной выше команды

NGCMN    NGCMX     NGC     S0C  
87040.0 1397760.0 1327616.0 107520.0 

NGCMN   Minimum new generation capacity (KB).
NGCMX   Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).

Дополнительные сведения об этом см. На странице http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html

person Pravin Bansal    schedule 07.12.2016

Найдите идентификатор процесса вашего webapp / java процесса сверху. Используйте jmap heap, чтобы получить распределение кучи. Я тестировал это на AWS-Ec2 для эластичного бобового стебля.

На изображении ниже максимальная куча 3 ГБ для приложения.

введите описание изображения здесь

person vsingh    schedule 10.07.2020