JVM将停止
抛出异常或错误永远不会停止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并没有停止,因为永无止境的线程继续运行.