本文想记录一下尝试产生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(); } } }