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=serialXdump (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) 来更改此配置:-Xdump 中的 file 参数所指定的位置(请参阅 -Xdump:what 中的“previous label”属性)。 您应将此位置更改为具有足够空间的专用分区。 例如:-Xdump:directory=/var/dumps/