程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java stackoverflow error,javastackoverflow

Java stackoverflow error,javastackoverflow

編輯:JAVA綜合教程

Java stackoverflow error,javastackoverflow


本文想記錄一下嘗試產生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();
            
        }        
        
    }

}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved