Инструмент командной строки, чтобы найти размер кучи 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/