6

我知道当OutOfMemoryException这个 JVM 上发生 an 时可以转储堆,但是是否可以使用jmap或之类的工具询问实时转储jconsole

4

4 回答 4

6

您需要知道有“系统”转储(基本上是操作系统核心文件)和“堆”,即便携式堆转储(PHD)。后面的那些用处不大,因为它们不包含实际数据。默认情况下它们是启用的。

在 AIX 或 Linux 上 通常您将设置-Xdump:system(缩写为-Xdump:system:events=gpf+user)以允许kill -3 <pid>触发堆转储。

顺便说一句,您可以使用默认选项使用kill -ABRT <pid>. 但是,这将终止您的 JVM。

运行java -Xdump:what以查看您的默认设置,例如:

> /usr/java6/bin/java -Xdump:what -version

Registered dump agents
----------------------
-Xdump:system:
    events=gpf+abort+traceassert,
    label=/home/u0002824/core.%Y%m%d.%H%M%S.%pid.%seq.dmp,
    range=1..0,
    priority=999,
    request=serial
----------------------
...
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap3260sr9fp2-20110627_03(SR9 FP2))

打开系统转储:

> /usr/java6/bin/java -Xdump:system -Xdump:what -version

Registered dump agents
----------------------
-Xdump:system:
    events=gpf+user+abort+traceassert,
    label=/home/u0002824/core.%Y%m%d.%H%M%S.%pid.%seq.dmp,
    range=1..0,
    priority=999,
    request=serial
----------------------
-Xdump:heap:
    events=systhrow,
    filter=java/lang/OutOfMemoryError,
    label=/home/u0002824/heapdump.%Y%m%d.%H%M%S.%pid.%seq.phd,
    range=1..4,
    priority=500,
    request=exclusive+compact+prepwalk,
    opts=PHD
----------------------
-Xdump:java:
    events=gpf+user+abort+traceassert,
    label=/home/u0002824/javacore.%Y%m%d.%H%M%S.%pid.%seq.txt,
    range=1..0,
    priority=400,
    request=exclusive+preempt
----------------------
-Xdump:java:
    events=systhrow,
    filter=java/lang/OutOfMemoryError,
    label=/home/u0002824/javacore.%Y%m%d.%H%M%S.%pid.%seq.txt,
    range=1..4,
    priority=400,
    request=exclusive+preempt
----------------------
-Xdump:snap:
    events=gpf+abort+traceassert,
    label=/home/u0002824/Snap.%Y%m%d.%H%M%S.%pid.%seq.trc,
    range=1..0,
    priority=300,
    request=serial
----------------------
-Xdump:snap:
    events=systhrow,
    filter=java/lang/OutOfMemoryError,
    label=/home/u0002824/Snap.%Y%m%d.%H%M%S.%pid.%seq.trc,
    range=1..4,
    priority=300,
    request=serial
----------------------
...

不要忘记jre/bin/jextract核心上运行。* .dmp文件。

于 2012-10-01T18:40:03.367 回答
4

你有几个选择:

此列表并不详尽。

于 2010-12-10T09:36:16.283 回答
3

好的,我最终会回答自己:应用程序有一个远程管理界面,所以我将实现一个调用该com.ibm.jvm.Dump.HeapDump()方法的新命令。

于 2010-12-11T21:42:15.357 回答
0

我认为有一个像 JProfiler 这样的工具。它会很好地与 Eclipse 一起工作

于 2010-12-10T07:10:07.387 回答