我有一個用例,我想確保 Java 行程在出現 OOM 問題時以代碼 137 退出。
這里我做了一些實驗:
public static void main(String[] args) {
List<byte[]> arr = new ArrayList<>();
while(true) {
arr.add(new byte[4096]);
}
}
MacOs 結果:
java oom.java
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Main.main(oom.java:21)
echo $?
1
因此,在 OOM 的情況下,JVM 以退出代碼 1 回答似乎很明顯。
所以我嘗試了:
public static void main(String[] args) {
List<byte[]> arr = new ArrayList<>();
try {
while(true) {
arr.add(new byte[4096]);
}
} catch (OutOfMemoryError outOfMemoryError) {
System.exit(137);
}
}
這給出了相同的結果。還有這個選項:-XX: ExitOnOutOfMemoryError它給出了退出代碼 3。
為什么System.exit(137)會被忽視?無論如何要做到這一點?
uj5u.com熱心網友回復:
Afaik 137 狀態意味著 JVM 已被外部行程殺死,并且您無法從應用程式內的 OOM 上強制退出此狀態。我沒有找到官方檔案,但這篇文章證實了它http://journal.thobe.org/2013/02/jvms-and-kill-signals.html。
基本上,如果您想在 OOM 上獲取 137 代碼 - 您的應用程式應該被 OOM 上的其他行程殺死。您可以通過使用-XX:OnOutOfMemoryError在 OOM 上執行一些任意腳本的標志來實作這一點。IE:
/scripts/kill.sh
kill -9 $(ps aux | grep "OOM.java" | grep -v "grep" | awk '{print $2}')
java -Xmx256m -XX:OnOutOfMemoryError=/scripts/kill.sh OOM.java
echo $?
#
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="/scripts/kill.sh"
# Executing "scripts/kill.sh"...
[1] 4280 killed java -Xmx256m OOM.java
137
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/429910.html
標籤:爪哇
