JVM抛出异常的原因

1.Java堆溢出

2.虚拟机栈和本地方法栈溢出

单线程环境下栈帧太大 或者虚拟机栈容量太小都会抛出stackoverflow异常

public class JavaVMStackSOF {
    private int stackLength = 1;
    public  void stackLeak(){
        stackLength++;
        stackLeak();
    }
    public static void main(String[] args) {
        JavaVMStackSOF oom = new JavaVMStackSOF();
        try{
            oom.stackLeak();
        }catch (Throwable e){
            System.out.println("Stack length:" + oom.stackLength);
            throw e;
        }
    }
}

-Xss 每个堆栈的大小
JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。一般设置这个值就可以了
调大每个堆栈的大小,可以让这个线程的栈递归的深度更深;在相同物理内存下,减小这个值能生成更多的线程.

3.方法区和运行时常量池溢出

4.本机直接内存溢出

你可能感兴趣的:(JVM抛出异常的原因)