本文想記錄一下嘗試產生stackoverflow的程序java
1 -Xss=1k, 設置stack大小1024個字節,產生515個long,想把stack撐爆。數組
2 嵌套調用ide
3 建立大量線程函數
1 -Xss=1k, 設置stack大小1024個字節,產生515個long,想把stack撐爆。spa
結論:不可能操作系統
1 Java裏面的stack是動態擴展的,不是固定設死的。所以沒法實施線程
2 Java的對象都是引用,不會在棧上分配空間。這個從C++過來的人,必定要注意。code
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 嵌套調用blog
結論:能夠撐爆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(); } } }