Как создать дамп кучи для моего процесса JBoss без jhat или jstat?

Я использую JBoss 7.1.3 со следующими версиями Java, Linux…

[dave@mymachine ~]$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
[dave@mymachine ~]$ uname -a
Linux mymachine.mydomain.org 4.1.99-99.88.amzn1.x86_64 #1 SMP Fri Feb 5 23:44:22 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Я хочу выяснить, сколько кучи используется (не максимальное количество, а то, что используется в данный момент). К сожалению, на нашей машине у меня нет доступа к jmap или jstat. Поэтому я хотел сделать дамп кучи, используя «kill -3». Итак, я сначала получил pid процесса моего босса

[dave@mymachine ~]$ ps -elf | grep jboss
1 S root      1251     1  0  80   0 - 28870 -      07:03 ?        00:00:00 /bin/sh /etc/rc3.d/S84jboss start
4 S root      1254  1251  0  80   0 - 34424 -      07:03 ?        00:00:00 runuser -s /bin/bash jboss -c ulimit -S -c 0 >/dev/null 2>&1 ; LAUNCH_JBOSS_IN_BACKGROUND=1 JBOSS_PIDFILE=/var/run/jboss-as/jbos-as-standalone.pid /usr/java/jboss/bin/standalone.sh -c standalone.xml
4 S jboss     1255  1254  0  80   0 - 28271 -      07:03 ?        00:00:00 bash -c ulimit -S -c 0 >/dev/null 2>&1 ; LAUNCH_JBOSS_IN_BACKGROUND=1 JBOSS_PIDFILE=/var/run/jboss-as/jboss-as-standalone.pid /usr/java/jboss/bin/standalone.sh -c standalone.xml
0 S jboss     1256  1255  0  80   0 - 28272 -      07:03 ?        00:00:00 /bin/sh /usr/java/jboss/bin/standalone.sh -c standalone.xml
0 S jboss     1289  1256  3  80   0 - 603908 -     07:03 ?        00:18:26 /usr/java/default/bin/java -D[Standalone] -server -XX:+UseCompressedOops -Xms256m -Xmx1024m -XX:MaxPermSize=512m -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Djboss.server.default.config=standalone.xml -Dorg.jboss.as.logging.per-deployment=false -Dorg.jboss.boot.log.file=/usr/java/jboss/standalone/log/boot.log -Dlogging.configuration=file:/usr/java/jboss/standalone/configuration/logging.properties -jar /usr/java/jboss/jboss-modules.jar -mp /usr/java/jboss/modules -jaxpmodule javax.xml.jaxp-provider org.jboss.as.standalone -Djboss.home.dir=/usr/java/jboss -Djbos.server.base.dir=/usr/java/jboss/standalone -c standalone.xml
0 S 602      21746 20632  0  80   0 - 27615 pipe_w 16:46 pts/1    00:00:00 grep --color=auto jboss

а потом побежал "убить -3"...

[dave@mymachine ~]$ sudo kill -3 1289 1256

но ничего не распечатывается и в текущем каталоге не создается файл. Как создать дамп кучи с моими текущими ограничениями?


person Dave    schedule 09.03.2016    source источник


Ответы (2)


Я подозреваю, что основная причина того, что у вас нет доступа к превосходным инструментам обслуживания, таким как jmap, jstack и т. д., заключается в том, что они не являются частью пакетов openjdk-6-jre или openjdk-7-jre Linux (я предполагаю, что дистрибутив Debian здесь). Я не понимаю, почему это должно быть так. На мой взгляд, эти инструменты должны быть частью JRE, а не JDK. Вот доказательство:

$> apt-file list openjdk-6-jdk | grep jmap
openjdk-6-jdk: /usr/lib/jvm/java-6-openjdk-amd64/bin/jmap
openjdk-6-jdk: /usr/lib/jvm/java-6-openjdk-amd64/man/ja_JP.eucJP/man1/jmap.1.gz
openjdk-6-jdk: /usr/lib/jvm/java-6-openjdk-amd64/man/man1/jmap.1.gz
$> apt-file list openjdk-6-jre | grep jmap
<nothing>

В любом случае, чтобы получить эти инструменты, вам следует подумать об использовании JDK и установить их с помощью sudo apt-get install openjdk-6-jdk. Это должно дать вам не только последнюю сборку JDK 6 (которая, кстати, очень-очень старая). Затем вы должны получить доступ к инструментам, которые дают нам дамп кучи для последующего анализа.

Дамп кучи сильно отличается от дампа потока, который показывает, что делают потоки JVM. Один из способов получить дамп потока — отправить сигнал QUIT процессу JVM (используя, как вы сказали: kill -3). Это покажет дамп потока везде, где перенаправляется стандартный вывод JVM. (Почти) эквивалентным инструментом является jstack, который, опять же, является частью пакета JDK, а не пакета JRE.

Но дамп потока - это не то, что вам нужно. Вам нужен дамп кучи. Итак, вам нужно jmap.

Кроме того, вы можете оценить фактическую память, используемую JVM, с помощью незаменимой команды Linux top. Убедитесь, что вы правильно анализируете выходные данные, чтобы получить оценку того, сколько кучи используется JVM.

Если вы столкнулись с OutOfMemoryError в своей JVM, то вам следует подумать о том, чтобы начать ее с -XX:+HeapDumpOnOutOfMemoryError, чтобы при выбрасывании OOME вы могли, по крайней мере, получить дамп кучи. Но таким образом вы сможете получить дамп кучи только после того, как у вас закончится место в куче!

person Kedar Mhaswade    schedule 09.03.2016
comment
Как я уже сказал в своем вопросе, у меня нет доступа к jmap и нет возможности установить эти инструменты. Как мне определить приблизительный размер кучи, используя top? Информация о моем дистрибутиве Linux включена в мой вопрос (вверху). - person Dave; 09.03.2016
comment
Было непонятно, почему у вас нет доступа к jmap, поэтому я решил уточнить. Использование top/freemem/ps/smem для оценки памяти, используемой процессами, описано во многих местах: ср. здесь. Здесь нет ничего конкретного для JVM. Linux рассматривает процесс JVM как любой другой. - person Kedar Mhaswade; 10.03.2016
comment
Итак, я ясно понимаю, что в ссылке, которую вы разместили, описывая top, не упоминается куча Java. Статистика памяти RES и SHR, сообщаемая top, никоим образом не относится к фактическому объему используемой памяти кучи Java, но поправьте меня, если я ошибаюсь. - person Dave; 10.03.2016
comment
Правильно. Вы можете сделать оценку, используя эти инструменты. top и др. сообщать о памяти (RSS/SHR), используемой процессом операционной системы. Вы также можете воспользоваться некоторыми подсказками из настройки -Xmx, которую вы использовали для запуска JVM, чтобы соединить точки. -Xmx указывает максимальную адресуемую (виртуальную) память кучи, которую вы просите JVM запрашивать у ОС при ее запуске. Существует много литературы о -Xmx, с которой вам следует ознакомиться. - person Kedar Mhaswade; 10.03.2016
comment
По какой-то причине мне трудно сообщить, что я хочу сделать. Меня не волнует максимальная выделенная куча (как указано в параметре -Xmx), я хочу знать, сколько кучи используется в данный момент. RES, как сообщается сверху, - это разрешенная память для java-процесса, опять же, не то, что я хочу. Круто, если ты не знаешь ответа, я тоже! - person Dave; 10.03.2016
comment
Если вы хотите знать, сколько кучи в настоящее время используется при данных обстоятельствах на вашем компьютере с Linux, то да, я не знаю. Но я все еще считаю, что мой ответ на ваш первоначальный вопрос верен. - person Kedar Mhaswade; 10.03.2016
comment
Давайте продолжим обсуждение в чате. - person Kedar Mhaswade; 10.03.2016
comment
Чтобы было ясно, top показывает размер процесса, а не размер кучи Java и не занятость в реальном времени. Для этого вам нужно использовать инструменты, которые понимают внутренние структуры данных JVM. Эти инструменты будут включать jmap и универсальное средство просмотра mbean, которое есть в JConsole (также есть только в JDK, а не в JRE). - person Kirk; 12.12.2017

установите -XX:HeapDumpPath=mpath/heapdump в доступный для записи каталог или файл в командной строке Java для запуска JBOSS. Этот путь/файл должен быть доступен для записи для пользователя, под которым работает JBOSS, а затем снова попробуйте опцию kill -3.

https://blogs.oracle.com/sundararajan/entry/programmatically_dumping_heap_from_java

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

см. класс для создания дампа кучи

person Chris    schedule 27.04.2016