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

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

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

Я ищу что-то вроде:
  Макс. Память: 1 ГБ
  Минимальная память: 256 МБ
  Память кучи: 700 МБ
  Используемая память: 460 МБ

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

java -XX:+PrintFlagsFinal -version | grep HeapSize

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

Ответ 4

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

Ответ 5

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

jps -lvm

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

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

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

Ответ 6

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

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

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

Пример: jvm-mon

Ответ 7

Поздно вечером, но очень простое решение - использовать скрипт 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

Ответ 8

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

Ответ 9

Начиная с 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 перейдите по ссылке: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html.

Ответ 10

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

jps -lvm

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

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

Ответ 14

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

ps aux | grep java

или

ps -ef | grep java

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

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

java -XX:+PrintFlagsFinal -version | grep HeapSize

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

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

и найдите InitialHeapSize и MaxHeapSize, который находится в байтах.

Ответ 15

проверить https://github.com/TeoGia/jotun Это простая программа, которая выводит использование кучи в формате json

Ответ 16

До сих пор не существует такого инструмента для печати памяти кучи в формате, который вы запрашивали . Единственный и единственный способ печати - это написать 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/