`
ymm8505
  • 浏览: 32217 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

写程序让Java的堆、栈分别溢出……

    博客分类:
  • Java
阅读更多
写程序让Java的堆、栈分别溢出……
像这样蛋疼的问题估计也只能在面试的时候问一问了、
看了一些简单的JVM内存分配的博客和书籍、
知道堆、栈上面分别存储的是什么东西、这个事情就稍微好办一些了、

【1、Java栈溢出  思路 递归调用 】
如果想要栈溢出,可以递归调用方法,这样随着栈深度的增加,JVM 维持着一条长长的方法调用轨迹,直到内存不够分配,产生栈溢出。
public class Scheduled {
 public void testStack(){  
        this.testStack();  
     } 
 public static void main(String[] args){
        Scheduled s  = new Scheduled();
        s.testStack();
  }
}


【2、Java堆溢出  思路 一直创建大对象 】
//		java堆溢出 
		Vector v=new Vector();
		for(int i=0;i<2500;i++){
			v.add(new byte[1*1024*1024]);
		}

  还有一种方式写一个死循环创建一个ArrayList 一直往里放一个静态对象。但是在我自己的电脑测试始终不能溢出。程序如下:

public class Scheduled {
	static class OOMObject{
	        
	    }	
	public void testHeap(){  
        for(;;){  
              ArrayList<OOMObject> list = new ArrayList<OOMObject> ();  
              list.add(new OOMObject());
          }  
        }
     public static void main(String[] args){
		Scheduled s  = new Scheduled();
		s.testHeap();
     }
}

----上面这个例子把创建list的语句放到for循环外面搞定!创建一个list一直往里add不是一直创建好多个list每个里面扔一个。



参考资料:
http://fxlzs2000.iteye.com/blog/1786407
http://www.uucode.net/201504/jvm1

测试代码如下:近期会一直保持更新,欢迎关注~
https://github.com/ymm8505/InterviewStudy.git
2
1
分享到:
评论
7 楼 ymm8505 2015-11-14  
【强烈推荐大家一定挤出时间来看看 深入理解JAVA虚拟机那本书 在第二章就对JVM 内存块做了详细的讲解…… 和各种堆栈溢出的情况 】 找不到书的,网盘地址:
链接:http://pan.baidu.com/s/1i3yIjwL 密码:t9jk
6 楼 ymm8505 2015-11-12  
wwwcomy 写道
ymm8505 写道
wwwcomy 写道
死循环里面的list一次循环完就没有引用了

大侠有什么好的建议没有! 求教


直接往一个静态容器里放对象就行了

加参数-Xmx10m,不然会跑的慢


public class stringTest {

	static List holder = new ArrayList();

	public static void main(String[] args) throws Exception {
		Random r = new Random();
		while (true) {
			holder.add(r.nextInt());
		}
	}
}

搞定了……  感谢!!

------------------------------------------
static List list = new ArrayList<Object>();
public static void main(String[] args) {
while(true){
list.add(new Object());
}
}
5 楼 wwwcomy 2015-11-11  
ymm8505 写道
wwwcomy 写道
死循环里面的list一次循环完就没有引用了

大侠有什么好的建议没有! 求教


直接往一个静态容器里放对象就行了

加参数-Xmx10m,不然会跑的慢


public class stringTest {

	static List holder = new ArrayList();

	public static void main(String[] args) throws Exception {
		Random r = new Random();
		while (true) {
			holder.add(r.nextInt());
		}
	}
}
4 楼 ymm8505 2015-11-11  
wwwcomy 写道
死循环里面的list一次循环完就没有引用了

大侠有什么好的建议没有! 求教
3 楼 ymm8505 2015-11-11  
ice-fire 写道
先通过Xms和Xmx设置一下堆的容量啊亲

恩 这个我想到了、我就是想写一个 不需要设置堆大小、用程序跑堆溢出的
2 楼 wwwcomy 2015-11-11  
死循环里面的list一次循环完就没有引用了
1 楼 ice-fire 2015-11-11  
先通过Xms和Xmx设置一下堆的容量啊亲

相关推荐

Global site tag (gtag.js) - Google Analytics