Как проверить использование кучи работающей 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