一 开发中虚拟机栈遇到的异常
Java 虚拟机规范允许 Java 栈的大小是动态的或者是固定不变的。
如果采用固定大小的 Java 虚拟机栈,那每一个线程的 Java 虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过 Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出一个 StackoverflowError 异常。
如果 Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个 outofMemoryError 异常。
二 实战
1 代码
/**
* 演示栈中的异常:StackOverflowError
* 默认情况下:count:9847
* 设置栈的大小: -Xss256k count:2251
*/
public class StackErrorTest {
private static int count = 1;
public static void main(String[] args) {
System.out.println(count++);
main(args);
}
}
2 测试
默认情况下,当 count = 9847 时发生异常。
设置栈的大小: -Xss256k 当 count = 2251 时发生异常。
三 设置栈内存大小
可以使用参数 -Xss 选项来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度。
-Xss1m
-Xss1k
四 参考
https://docs.oracle.com/en/java/javase/11/tools/tools-and-command-reference.html