Убить / Термин Ява на память - PullRequest
0 голосов
/ 03 июня 2018

Я написал следующую простую программу:

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, но файл не был создан.Что я сделал не так?

1 Ответ

0 голосов
/ 03 июня 2018

-XX:OnOutOfMemoryError работает только для OutOfMemoryErrors, генерируемых самой JVM.

Генерируемые пользователем OutOfMemoryErrors не отличаются от любых других обычных Throwable, и они не обрабатываются специально JVM.

...