JVM被杀死的场景?

day*_*mer 2 java jvm scala

我正在考虑JVM因编程错误而被杀的所有场景?

SomeOne声称java.lang.OutOfMemoryError: Java heap space不会导致JVM被杀,但是当我运行我的程序断言时,这并不是真的.我试过这个程序

我在哪里可以找到列表recoverableun-receoverable错误?

谢谢

JB *_*zet 5

JVM将停止

  • 当它因JVM中的错误而崩溃时
  • 当所有非守护程序线程停止运行时
  • 调用System.exit()时

抛出异常或错误永远不会停止JVM.但它可以做什么,如果它没有被捕获,是否导致它被调用的线程终止它的执行.如果它是最后一个运行的非守护程序线程,那么JVM将停止.

例:

public static void main(String[] args) {
    Runnable r = new Runnable() {
        public void run() {
            while (true) {
                System.out.println("still running...");
                try {
                    Thread.sleep(1000L);
                }
                catch (InterruptedException e) {
                    // ignore: I don't want to die
                }
            }
        }
    };

    Thread neverEndingThread = new Thread(r);
    neverEndingThread.start();

    List<byte[]> arrays = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {
        byte[] hugeArray = new byte[2_000_000_000];
        arrays.add(hugeArray);
    }
    System.out.println(arrays);
}
Run Code Online (Sandbox Code Playgroud)

执行此代码将启动一个新线程,然后将导致从主线程抛出OutOfMemoryError.由于主线程未捕获此错误,因此主线程停止执行.但是JVM并没有停止,因为永无止境的线程继续运行.