JavaのOOMのコマンドラインオプション

JavaのOOMのコマンドラインオプションについての備忘録。

ソースコード

OOMが発生するソースコード

public class Main {
    public static void main(String[] args) {
        byte[] buff = new byte[Integer.MAX_VALUE];
    }
}

Demo

今回はOpen JDK 17を使う。

% sdk use java 17.0.1-open

オプションなし

% java Main.java
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at Main.main(Main.java:3)

HeapDumpOnOutOfMemoryError

OOM発生時にヒープダンプを出力する。

% java -XX:+HeapDumpOnOutOfMemoryError Main.java
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
Dumping heap to java_pid37573.hprof ...
Heap dump file created [26773152 bytes in 0.063 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at Main.main(Main.java:3)

ヒープダンプのファイル名を指定する場合。

% java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof Main.java
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
Dumping heap to ./heapdump.hprof ...
Heap dump file created [26774126 bytes in 0.058 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at Main.main(Main.java:3)

OnOutOfMemoryError

OOM発生時にコマンドやスクリプトを実行する。

% java -XX:OnOutOfMemoryError="echo %p" Main.java
#
# java.lang.OutOfMemoryError: Requested array size exceeds VM limit
# -XX:OnOutOfMemoryError="echo %p"
#   Executing "echo 61311"...
61311
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at Main.main(Main.java:3)
% java -XX:OnOutOfMemoryError="kill -9 %p" Main.java
#
# java.lang.OutOfMemoryError: Requested array size exceeds VM limit
# -XX:OnOutOfMemoryError="kill -9 %p"
#   Executing "kill -9 20112"...
zsh: killed     java -XX:OnOutOfMemoryError="kill -9 %p" Main.java

ExitOnOutOfMemoryError

OOM発生時に終了する。

% java -XX:+ExitOnOutOfMemoryError Main.java
Terminating due to java.lang.OutOfMemoryError: Requested array size exceeds VM limit

CrashOnOutOfMemoryError

OOM発生時にエラーファイルを出力して終了する。

% java -XX:+CrashOnOutOfMemoryError Main.java
Aborting due to java.lang.OutOfMemoryError: Requested array size exceeds VM limit
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (debug.cpp:364), pid=74771, tid=7683
#  fatal error: OutOfMemory encountered: Requested array size exceeds VM limit
#
# JRE version: OpenJDK Runtime Environment (17.0.1+12) (build 17.0.1+12-39)
# Java VM: OpenJDK 64-Bit Server VM (17.0.1+12-39, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-amd64)
# Core dump will be written. Default location: /cores/core.74771
#
# An error report file with more information is saved as:
# /xxxx/hs_err_pid74771.log
zsh: abort      java -XX:+CrashOnOutOfMemoryError Main.java

参考