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.本机直接内存溢出

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,818评论 3 83
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,174评论 1 32
  • 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器...
    jemmm阅读 2,270评论 0 9
  • Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒...
    愤怒的_菜鸟阅读 2,148评论 0 24
  • 1.写出synchronized的使用方式 synchronized的三种应用方式 synchronized关键字...
    wuyuan0127阅读 316评论 0 1