Как проверить использование кучи работающей JVM из командной строки?

Могу ли я проверить использование кучи работающей JVM из командной строки, я имею в виду фактическое использование, а не максимальное количество, выделенное с помощью Xmx.

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

5 ответов

Решение

Вы можете использовать jstat, например:

 jstat -gc pid

Полные документы здесь: http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html

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

jstat -gc <PID> | tail -n 1 | awk '{split($0,a," "); sum=a[3]+a[4]+a[6]+a[8]; print sum}'

Команда в основном подводит итог:

  • S0U: использование пространства выжившего 0 (кБ).
  • S1U: использование пространства выжившего 1 (кБ).
  • ЕС: использование пространства Eden (кБ).
  • OU: использование старого пространства (кБ).

Возможно, вы также захотите включить метапространство и использование сжатого пространства классов. В этом случае вы должны добавить [10] и [12] к сумме в awk.

Вся процедура сразу. Основано на ответе @Till Schäfer.

В кб...

jstat -gc $(ps axf | egrep -i "*/bin/java *" | egrep -v grep | awk '{print $1}') | tail -n 1 | awk '{split($0,a," "); sum=a[3]+a[4]+a[6]+a[8]+a[10]+a[12]; print sum}'

В мб...

jstat -gc $(ps axf | egrep -i "*/bin/java *" | egrep -v grep | awk '{print $1}') | tail -n 1 | awk '{split($0,a," "); sum=(a[3]+a[4]+a[6]+a[8]+a[10]+a[12])/1024; print sum" MB"}'

Ссылка "Awk sum":

 a[1] - S0C
 a[2] - S1C
 a[3] - S0U
 a[4] - S1U
 a[5] - EC
 a[6] - EU
 a[7] - OC
 a[8] - OU
 a[9] - PC
a[10] - PU
a[11] - YGC
a[12] - YGCT
a[13] - FGC
a[14] - FGCT
a[15] - GCT

Спасибо!

ПРИМЕЧАНИЕ: работает на OpenJDK!

ДАЛЬНЕЙШИЙ ВОПРОС: Неправильная информация?

Если вы проверите использование памяти с ps Команда, вы увидите, что процесс Java потребляет гораздо больше...

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |cut -d "" -f2 | cut -d "-" -f1

Если вы начнете выполнение с включенным ведением журнала gc, вы получите информацию о файле. В противном случае 'jmap -heap ' даст вам то, что вы хотите. Смотрите страницу документации Jmap для получения дополнительной информации.

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

Если вы используете JDK 8 и выше, используйте jcmd:

jcmd <pid> GC.heap_info

Другие вопросы по тегам