[AIX Solaris HP-UX Linux Windows][IBM i]

OutOfMemory 错误的默认行为

在 IBM® Java™ 5 及更高版本中,默认情况下,Java 进程生命周期中的前四个 OutOfMemory(OOM ) 错误会产生一个便携式堆转储(PHD)格式的堆转储、一个 Java 转储文件 (javacore) 和一个 snap 转储文件。

在 IBM Java 6 R26 和更高版本中, Java 进程生存期的第一个 OOM 在 Linux®, AIX®和 IBM i 上生成 PHD 格式的堆转储, Java 转储文件,快照转储文件和操作系统转储核心文件 (不与 javacore 混淆) ,在 Windows 操作系统上生成具有完整内存的用户方式小型转储,在 z/OS®上生成 SYSTDUMP。 第二个,第三个和第四个 OOM 错误仅生成 PHD 格式的堆转储和 Java 转储文件。

系统转储是 PHD 堆转储的超集。 系统转储还包含内存内容(字符串、原语、变量名称等等)、线程和帧本地信息、某些本机内存信息等等。 有关更多信息,请转至 https://publib.boulder.ibm.com/httpserv/cookbook/Major_Tools-Eclipse_Memory_Analyzer_Tool.html。 这一增加的信息可以解决很大一类问题,提供对运行 JVM 的更广泛洞察力并最终减少解决问题所花费的时间。 在 IBM Java 5 R12 或更低版本以及 IBM Java 6 R9 或更低版本中,必须使用 jextract 工具对系统转储进行后处理。 使用最新版本的 IBM Java ,系统转储可以由支持 DTFJ 的工具 (例如 Memory Analyzer Tool) 直接装入,而无需对 OOM 进行任何后处理 (就像 PHD 堆转储一样)。 但是对于崩溃,仍应该使用 jextract。

可以使用 -Xdump:what 通用 JVM 自变量来获取缺省配置。 例如,运行 $WAS/java/bin/java -version -Xdump:what 会生成以下输出 (某些输出已除去)。 请特别注意 range 选项。
# java -version -Xdump:what
Registered dump agents
...
-Xdump:system:
    events=systhrow,
    filter=java/lang/OutOfMemoryError,
    label=... core.&Y&m&d.&H% M% S.% pid.% seq.dmp,
    range=1..1,
    priority=999,
    request=exclusive+compact+prepwalk
...
-Xdump:heap:
    events=systhrow,
    filter=java/lang/OutOfMemoryError,
    label=... heapdump.% Y% m% d.% H% M% S.% pid.% seq.phd,
    range=1..4,
    priority=500,
    request=exclusive+compact+prepwalk,
    opts=PHD
...
-Xdump:java:
    events=systhrow,
    filter=java/lang/OutOfMemoryError,
    label=... javacore.% Y% m% d.% H% M% S.% pid.% seq.txt,
    range=1..4,
    priority=400,
    request=exclusive+preempt
...
-Xdump:snap:
    events=systhrow,
    filter=java/lang/OutOfMemoryError,
    label=... Snap.% Y% m% d.% H% M% S.% pid.% seq.trc,
    range=1..4,
    priority=300,
    request=serial
注: 在每次出现% 字符之后,都向此示例添加了空格,以避免本文档中的文本发生不适当的转换。
可以使用-Xdump (https://www.ibm.com/docs/en/SSYKE2_8.0.0/openj9/xdump/index.html#default-dump-agents) 通用 JVM 参数 (http://www-01.ibm.com/support/docview.wss?uid=swg21417365) 来更改此配置:
  • 要还原为 OOM 的旧行为,请使用:
    -Xdump:system:none -Xdump:system:events=gpf+abort+traceassert+corruptcache
    
  • 要在 OOM 上移除 PHD 堆转储,请使用:
    -Xdump:heap:none
    
  • 要在 OOM 上移除 PHD 堆转储并且不只在的一个 OOM 而是在前四个 OOM 上获取系统转储,请使用:
    -Xdump:heap:none 
    -Xdump:system:none 
    -Xdump:system:events=gpf+abort+traceassert+corruptcache 
    -Xdump:system:events=systhrow,filter=java/lang/OutOfMemoryError,range=1..4,request=exclusive+compact+prepwalk
系统转储写入到 -Xdump 中的 file 参数所指定的位置(请参阅 -Xdump:what 中的“previous label”属性)。 您应将此位置更改为具有足够空间的专用分区。 例如:
-Xdump:directory=/var/dumps/