stackoverflow java_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 classMyMain {2

3 public static voidmain(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}; 注意这个虽然是基本变量的数组,但是也是在heap9 //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 classMyMain {private static voidfoo(){

foo();

}public static voidmain(String[] args) {

System.out.println("stack overflow");

foo();

}

}

3 创建大量线程

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

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

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

public classMyMain {public static voidmain(String[] args) {//TODO Auto-generated method stub

System.out.println("stack overflow");while(true){

Thread th= new Thread(newRunnable(){

@Overridepublic voidrun() {while(true){

System.out.println("do not stop");

}

}

});

th.start();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值