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

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

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

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

Макс. Память: 1 ГБ

Минимальная память: 256 МБ

Память кучи: 700 МБ

Используемая память: 460 МБ

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

Любой такой инструмент / команда?

Ответы на вопрос(14)

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

jps -lvm

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

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

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

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

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

 linehrr01 дек. 2017 г., 22:09
Команда top показывает, сколько ОС отдано JVM. эти парни спрашивают, как мы можем увидеть использование пространства кучи внутри JVM. Использование JVM 10g не означает, что реальное пространство кучи заполнено данными 10g, потому что jvm почти никогда не возвращает память обратно в ОС из кучи, пока вы не завершите процесс.

Есть инструмент командной строки с визуальным аспектом -пн-JVM, Это инструмент мониторинга JVM для командной строки, который отключается:

использование кучи, размер и макспроцессы JVMиспользование процессора и GCлучшие темы

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

Образец:

 tmanolatos21 сент. 2017 г., 17:17
Просто отметим, что jvm-mon работает только для Java8

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

Пример вывода режима обзора виртуальной машины:
  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
 oski8606 мая 2015 г., 22:28
Это действительно отличный инструмент, вроде htop, но с метриками из jstat. Спасибо за предложение, @MRalwasser.

ОтJava8 и выше, вы можете использовать следующую команду:

jcmdJAVA_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, посетите ссылку:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

 vaibhav gupta19 мар. 2019 г., 08:22
@PavelMolchanov Я могу использовать команду в jdk1.8.0_172. /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/bin/jcmd 98270 GC.heap_info. Пожалуйста, если можете, добавьте информацию к указанной теме, а я неНа данный момент у меня недостаточно репутации, чтобы добавить туда комментарий.
 Pavel Molchanov19 мар. 2019 г., 16:24
Еще один вопрос. Пожалуйста, проверьте версию JDK, которая запускает процесс 98270 в вашем примере. jcmd получает доступные команды от JVM процесса (в вашем случае 98270). Если процесс 98270 выполняется с другим JDK (JDK 9 или выше), вы увидите, что команда GC.heap_info доступна даже в самом JCMD из Java 8. Доступные команды могут отличаться для разных процессов. Чтобы получить доступные команды, выполните: jcmp <PID> Помогите.
 vaibhav gupta21 мар. 2019 г., 14:00
Да, я использую 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
 Pavel Molchanov08 мар. 2019 г., 00:01
Вы должны исправить свой комментарий. GC.heap_info доступен в Java 9 и выше. Это'не доступны в Java 8. Смотрите другой поток здесь:stackoverflow.com/questions/41891127/...
 Pavel Molchanov19 мар. 2019 г., 16:20
Вы используете 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/...

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

jps -lvm

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

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

Попробуйте это, это работало в 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).

 padippist18 янв. 2017 г., 07:47
@GaryGauh Это размер кучи по умолчанию. Чтобы найти использование запущенного приложения, вы должны сделать это в коде или вы можете использовать jconsole. Это то, что я знаю, должно быть много других способов.
 Gary Gauh17 янв. 2017 г., 08:04
Как найти использование памяти, разделенное на кучу, permsize, ... конкретного процесса Java с помощью pid?
 Micha Wiedenmann03 июл. 2018 г., 11:53
использованиеjstat -gc  для запуска приложений.

Каждый процесс Java имеетpid, который вы сначала должны найти сjps команда.

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

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

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

УвидетьJSTAT документы на оракулес сайта.

 linehrr15 апр. 2019 г., 03:01
@cybersoft должен бытьawk '{print $3+$4+$6+$8}'
 linehrr15 апр. 2019 г., 03:21
а также, это должно бытьawk '{print $3+$9}' иначе NGC + OGC, если мы неНе считайте Пермское пространство.
 patryk.beza19 мая 2015 г., 22:20
Стоит отметить цитату изjstat Oracle Java 8 руководствостраница:This command is experimental and unsupported
 Kerem14 мар. 2015 г., 02:57
jstat -gcutil <PID> 250 Н " Было очень полезно взять N выборок с интервалами 250 мс и отобразить выходные данные в процентах для соответствующих пробелов. Благодарю.
 cybersoft01 февр. 2017 г., 18:37
awk 'print {$3+$4+$6+$8}' может распечатать суммарное использование на Java 8 's jstat столбцы
 basZero05 февр. 2014 г., 10:44
Есть ли рекомендации, какие вариантыjstat нужно использовать, чтобы проверить только общее использование памяти JVM? Позволять'скажем, вы начинаете JVM сXms=4g а такжеXmx=4g и вы хотите увидеть, сколько памяти об этом уже используется?
 xdhmoore23 окт. 2017 г., 23:26
Были проблемы с другими ответами, но основнойps -ef | grep java показал мне аргументы vm, которые в моем случае включали значение -Xmx, и это было все, что мне было нужно.

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

ps aux | grep java

или же

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, которые находятся в байтах.

Если вы используете 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

Любой подход должен дать вам примерно одинаковое число. Это всегда хорошая идея выделить кучу, используя-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 mem примерно соответствует или больше, чем Max выделенной памяти, но до тех пор, покаиспользуемая память свободен / доступен в физической памяти, JVM не выдает исключение памяти. На самом деле, максимальная память даже не проверяется на предмет физической памяти при запуске JVM даже при выключенной операционной системе. Обсуждается лучшее объяснение того, что виртуальная память действительно используется процессом JavaВот.

Поздно вечером, но очень простое решение - использовать скрипт 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
 amarjeetAnand31 окт. 2017 г., 09:45
Похоже, вы получили ошибку в объявлении ассоциативного массива, который нуждается в bash>= 4. Также другая проблема может быть связана с запуском скрипта какsh jpsstat.sh " , Если это так, попробуйте запустить скрипт как./jpsstat.sh».
 Chris31 окт. 2017 г., 06:14
похоже, не работает из коробки на SUSE Linux (строка 38: Declare: -A: неверный параметр)

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

java -XX:+PrintFlagsFinal -version | grep HeapSize

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

 Johan25 янв. 2018 г., 14:53
Тем не менее, это очень полезный ответ для меня, когда я захожу на эту страницу через поиск в Google о том, как найти размер глобальной кучи.
 Madbreaks30 нояб. 2016 г., 18:10
Это неt ответить на вопрос, который конкретно спрашивает, как проверить использование кучи процесса. Команда здесь перечисляет значения по умолчанию JVM для всех процессов.
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

Ваш ответ на вопрос