簡體   English   中英

如何在沒有 jhat 或 jstat 的情況下為我的 JBoss 進程生成堆轉儲?

[英]How do I generate a heap dump for my JBoss process without jhat or 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

然后我跑了“kill -3”……

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

但沒有打印出來,也沒有在當前目錄中生成文件。 如何使用當前約束生成堆轉儲?

我懷疑您無法訪問jmapjstack等出色的可維護性工具的主要原因是它們不是openjdk-6-jreopenjdk-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

top ,您可以使用必不可少的 Linux top命令估計 JVM 使用的實際內存。 確保正確分析輸出以估計 JVM 使用了多少堆。

如果您在 JVM 中遇到OutOfMemoryError ,那么您應該考慮使用-XX:+HeapDumpOnOutOfMemoryError啟動它,以便在拋出OOME時,至少可以獲得堆轉儲。 但是這樣,您只能在堆空間用完后才能獲得堆轉儲!

將 -XX:HeapDumpPath=mpath/heapdump 設置為 java 命令行上的可寫目錄或文件,用於啟動 JBOSS。 對於運行 JBOSS 的用戶,此路徑/文件需要是可寫的,然后再次嘗試 kill -3 選項。

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

您也可以使用應用程序中的 HotSpotDiagnosticMXBean 進行堆轉儲。

查看轉儲堆的類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM