java - 有没有办法用 ibm-jdk for linux 进行实时堆转储?

标签 java java-6 jconsole jmap

我知道在这个 JVM 上发生 OutOfMemoryException 时可以转储堆,但是是否可以使用 jmap 等工具请求实时转储jconsole?

最佳答案

您需要注意存在“系统”转储(基本上是操作系统核心文件)和“堆”,也就是可移植堆转储 (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/jextractcore. * .dmp 文件上。

关于java - 有没有办法用 ibm-jdk for linux 进行实时堆转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4406464/

相关文章:

java - 使用 JConsole 等连接到卡住的 jvm

java - 在 Mock 对象上调用方法是调用真实方法而不是模拟实现

java - tcp 发送接受了错误的字节

java - 如何知道 Java 中 GeoTIFF/TIFF 文件的波段序列/名称?

java - 如何读取具有可变数组深度和结构的复杂 JSON 字符串?

java - hh :mm a and HH:mm a 之间的区别

java - 为什么 HashMap containsKey 在 Sun JDK 中比 get 慢? (太阳-jdk-1.6.0.17)

java - 在现有 tomcat 中部署我的应用程序

java - 为什么 JConsole 上的某些方法被禁用

java - JavaFX 自定义控制台中的线程冲突