当虚拟机栈空间无法扩展或者在创建线程时无法分配足够的内存时,会抛出 StackOverflowError
和 OutOfMemoryError
异常。
以下是两个示例:
1.StackOverflowError
public class StackOverflowExample {
public static void main(String[] args) {
stackOverflowMethod();
}
private static void stackOverflowMethod() {
stackOverflowMethod();
}
}
上面的代码在调用 stackOverflowMethod()
时,会不断地进行递归调用,导致栈空间不断压入方法栈帧,最终抛出 StackOverflowError
异常。
2.OutOfMemoryError
public class OutOfMemoryExample {
public static void main(String[] args) {
int threadCount = 0;
while (true) {
new Thread(() -> {
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
threadCount++;
System.out.println("Thread count: " + threadCount);
}
}
}
上面的代码会不断地创建线程,每个线程会休眠一段时间后再退出。如果创建线程的速度过快,而且每个线程休眠时间过长,就会导致栈空间不足,从而抛出 OutOfMemoryError
异常。