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

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

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

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

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

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

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

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

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

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



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

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



Есть инструмент командной строки с визуальным аспектом -[пн-JVM](https://github.com/ajermakovics/jvm-mon), Это инструмент мониторинга JVM для командной строки, который отключается:

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

Образец:[![](/imgs/xlBSu.png)](/imgs/xlBSu.png)



[jvmtop](https://github.com/patric-r/jvmtop) это инструмент командной строки, который обеспечивает просмотр в реальном времени по нескольким показателям, включая кучу

Пример вывода режима обзора виртуальной машины:

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

jcmd`JAVA_PROCESS_ID` GC.heap\_info

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

Для получения более подробной информации о команде jcmd, посетите ссылку:<https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html>



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

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



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

Для Windows:

Для Mac

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

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



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

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

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

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

Увидеть[JSTAT документы](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html) на оракулес сайта.



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

или же

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

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

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

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



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

Для дополнительных команд, таких как 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](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html) для этих значений на самом деле значат. Предполагая, что вы запускаете простой класс без 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[Вот.](https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used)



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

Идти к[Проект GitHub](https://github.com/amarjeetanandsingh/jps_stat) и скачать**jpsstat.sh** файлЩелкните правой кнопкой мыши на**jpsstat.sh** и перейтиразрешений вкладка и сделать его исполняемымТеперь запустите скрипт, используя следующую команду**./jpsstat.sh**Вот пример вывода скрипта -



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

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



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

Получить более подробную информацию об этом на[http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html](https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html)