Java stackoverflow error

本文想记录一下尝试产生stackoverflow的程序

1 -Xss=1k, 设置stack大小1024个字节,产生515个long,想把stack撑爆。

2 嵌套调用

3 创建大量线程

1 -Xss=1k, 设置stack大小1024个字节,产生515个long,想把stack撑爆。

结论:不可能

1 Java里面的stack是动态扩展的,不是固定设死的。因此无法实施

2 Java的对象都是引用,不会在栈上分配空间。这个从C++过来的人,一定要注意。

3 在有些操作系统上,分配的stacksize是固定的,容易撑爆stack。

  1 public class MyMain {    
  2 
  3     public static void main(String[] args) {
  4         
  5         System.out.println("stack overflow");
  6         
  7         //MyMain main;   这个是变量声明,不分配内存空间。
  8         //long aa[] = {0,0,0,0,00,0,0,0,0,0,0,00,0,0}; 注意这个虽然是基本变量的数组,但是也是在heap 
  9         //String str = "hello world"; 这个是在方法区/常量区分配
 10         
 11         long a0 = 0;
 12         long a1 = 0;
 13         long a2 = 0;
 14         ......525     
15 long a514 = 0; 526 527 } 528 529 }

 2 嵌套调用

结论:可以撑爆stack

函数的嵌套调用是有深度的,如果结束条件设置不恰当,那么很容易stack overflow

public class MyMain {
    
    private static void foo(){
        foo();
    }
    

    public static void main(String[] args) {    
        
        System.out.println("stack overflow");
        
        foo();
        
    }

}

 

3 创建大量线程

结论:在我的机器上,没有观察到.

设置-Xss=100M,只看到内存100M的速度增加,但是增加到7.9G多的时候就不动了,没有发生OutOfMemoryError。这个原因目前还不清楚。

在书《深入理解java虚拟机》中提到可以观察到OutOfMemoryError。

public class MyMain {    

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        System.out.println("stack overflow");    
        
        
        while(true){
            
            
            Thread th = new Thread(new Runnable(){

                @Override
                public void run() {                    
                    while(true){
                        System.out.println("do not stop");
                    }
                }
                
            });
            th.start();
            
        }        
        
    }

}

 

转载于:https://www.cnblogs.com/thirtyfive16/p/6088910.html