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
参考
- https://docs.oracle.com/en/java/javase/17/troubleshoot/prepare-java-troubleshooting.html
- https://docs.oracle.com/en/java/javase/17/troubleshoot/troubleshooting-memory-leaks.html
- https://www.oracle.com/java/technologies/javase/8u92-relnotes.html
- https://github.com/openjdk/jdk/blob/jdk-17-ga/src/hotspot/share/utilities/debug.cpp#L351-L371