OutOfMemoryError会导致线程死掉吗?

时间:2011-10-17 08:38:09

标签: java multithreading out-of-memory

OutOfMemoryError会导致生成的线程死掉吗?

它会从run()退出吗?

4 个答案:

答案 0 :(得分:3)

如果没有捕获,任何Throwable都会导致线程终止。错误通常不会(也不应该)被捕获。

答案 1 :(得分:1)

取决于错误是在线程内还是在另一个线程内抛出。请注意以下代码段的行为:

public class Test implements Runnable {

    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            System.out.println("alive");
        }
    }



    public static void main(String[] args) {
        new Thread(new Test()).start();
        throw new OutOfMemoryError();
    }
}

你可以很容易地看到,虽然在抛出Error之后主线程会立即死亡,但是生成的线程仍然存在。但是,根本不能保证哪个线程最终会抛出错误。

答案 2 :(得分:0)

OutOfMemoryError将JavaVM设置为未定义状态。运行线程不会被规则杀死,你的线程可能仍在运行,尽管有一个错误(如果你没有捕获它)。

但线程仍然可能因为内存不足而死亡(例如,它们的堆栈框架空间不足),但这取决于剩余的空间。 JVM只是变得不稳定。

答案 3 :(得分:0)

您的线程可能会永远保持在Running状态,因为它们等待来自JVM的内存分配,但由于JVM处于不稳定状态,因此不会分配任何内容并且状态维持无限时间!