首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有jhat或jstat的情况下为我的JBoss进程生成堆转储?

如何在没有jhat或jstat的情况下为我的JBoss进程生成堆转储?
EN

Stack Overflow用户
提问于 2016-03-10 00:52:14
回答 2查看 10.4K关注 0票数 0

我正在使用带有以下Java、Linux版本…的JBoss 7.1.3

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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

然后我运行了“kill-3”…

代码语言:javascript
复制
[dave@mymachine ~]$ sudo kill -3 1289 1256

但是不会输出任何内容,也不会在当前目录中生成任何文件。如何使用当前的约束生成堆转储?

EN

回答 2

Stack Overflow用户

发布于 2016-03-10 02:06:40

我怀疑你不能使用像jmapjstack等优秀的可服务性工具的主要原因是它们不是openjdk-6-jre或debian Linux包的一部分(我假设这里是debian发行版)。我不明白为何会这样。在我看来,这些工具应该是JRE的一部分,而不是JDK。这就是证据:

代码语言:javascript
复制
$> 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安装它们。这将使您不仅获得最新的JDK6构建(顺便说一句,非常非常旧)。然后,您应该能够访问为我们提供堆转储的工具,以便稍后进行分析。

堆转储与线程转储非常不同,线程转储显示JVM线程在做什么。获取线程转储的一种方法是向JVM进程发送QUIT信号(如您所说,使用:kill -3)。这将显示JVM的stdout被重定向的地方的线程转储。一个(几乎)等效的工具是jstack,它也是JDK包的一部分,而不是JRE包。

但是线程转储不是您所需要的。你需要堆转储。因此,您需要jmap

除此之外,您还可以使用必不可少的Linux top命令来估计JVM实际使用的内存。确保正确分析输出,以估计JVM使用了多少堆。

如果在JVM中遇到OutOfMemoryError,那么应该考虑使用-XX:+HeapDumpOnOutOfMemoryError启动它,这样当抛出OOME时,至少可以获得堆转储。但是通过这种方式,您只能在用完堆空间后才能获得堆转储!

票数 0
EN

Stack Overflow用户

发布于 2016-04-28 01:06:40

在启动JBOSS的java命令行中,将-XX:HeapDumpPath=mpath/heapdump设置为可写目录或文件。此路径/文件对于运行JBOSS的用户必须是可写的,然后再次尝试kill -3选项。

http://five.agency/java-heap-dump/

您也可以使用应用程序中的HotSpotDiagnosticMXBean进行堆转储,这也有问题。

请参阅class to dump heap

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35897701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档