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