Я написал следующую простую программу:
public class Main{
public static void main(String[] args) throws Exception{
new Thread(() -> {
try{
Thread.sleep(10000);
} catch(Exception ignored){ }
throw new OutOfMemoryError("BOOM!");
}).start();
while(true){
System.out.println("Doing some job...");
try{
Thread.sleep(1000);
} catch(Exception ignored){ }
}
}
}
Теперь я запускаю это с опциями java -XX:OnOutOfMemoryError = "kill -9 %p" Main и ожидаю, что программа получит SIGKILL с выданной ошибкой. Но в конечном итоге он печатает Doing some job... даже после того, как OutOfMemoryError был брошен:
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Exception in thread "Thread-0" java.lang.OutOfMemoryError: BOOM!
at Main.lambda$main$0(Main.java:11)
at java.lang.Thread.run(Thread.java:748)
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Doing some job...
Что в этом плохого?
Я на java 1.8.0_66
Я пытался сделать java -XX:OnOutOfMemoryError='kill -9 %p' Main и java "-XX:OnOutOfMemoryError=kill -9 %p" Main, но он все еще работает ...
Я также попытался проверить это и запустить sudo java -XX:OnOutOfMemoryError = "echo 233 > /root/oom" Main, и ожидалось, что /root/oom будет содержать 223, но файл не был создан. Что я сделал не так?
@Edwardth Просто попробовал с java "-XX:OnOutOfMemoryError=kill -9 %p" Main и java -XX:OnOutOfMemoryError='kill -9 %p' Main, и это не сработало ...
@Edwardth Я перепробовал все примеры, и никто не работает ...




-XX:OnOutOfMemoryError работает только с ошибками OutOfMemoryErrors, созданными самой JVM.
Созданные пользователем ошибки OutOfMemoryErrors не отличаются от других обычных Throwable и не обрабатываются JVM специально.
Возможный дубликат -XX: OnOutOfMemoryError = "kill -9% p" Проблема