`
ymm8505
  • 浏览: 33273 次
  • 性别: 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设置一下堆的容量啊亲

相关推荐

    完美解决java读取excel内存溢出问题.rar

    在Java开发中,处理大型Excel文件时,可能会遇到内存溢出的问题。这通常是由于Java的默认内存设置不足以处理大量数据导致的。本解决方案主要针对使用Apache POI库进行Excel读取时遇到的这类问题。 首先,Apache POI...

    区别Java中堆与栈区别Java中堆与栈

    Java 中的堆和栈是两个不同的内存区域,分别用于存放不同类型的数据。堆是一个运行时数据区,类的对象从中分配空间,通过new、newarray、anewarray 和 multianewarray 等指令建立,垃圾回收器会自动收走这些不再使用...

    缓冲区溢出——栈溢出

    栈溢出通常发生在函数调用时,当向栈中写入的数据量超过分配的缓冲区大小,就会溢出到栈上的其他区域,可能覆盖掉重要的数据,如返回地址,从而使攻击者有机会控制程序执行流程。 栈溢出的常见原因包括: 1. **未...

    java内存分配之常量池,栈,堆1

    在Java中,内存主要分为四个区域:寄存器、栈、堆和方法区(包括常量池)。以下是这四个区域的详细说明: 1. **寄存器**: 这是计算机硬件的一部分,用于存储非常快速访问的数据。在Java中,寄存器主要由JVM直接管理...

    java内存溢出示例(堆溢出、栈溢出)

    Java内存溢出,是编程过程中常见的问题之一,它通常会导致程序异常终止,影响系统的稳定性。内存溢出分为两种主要类型:堆溢出(Heap Overflow)和栈溢出(Stack Overflow)。接下来,我们将深入探讨这两种情况及其...

    JAVA内存溢出问题总结

    JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决...

    理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案.docx

    堆溢出是指 Java 应用程序在堆内存中申请空间时超出限制,导致内存不足无法创建新对象的错误。常见的堆溢出情况有: 1. OutOfMemoryError: Java heap space:堆内存中的空间不足以存放新创建的对象。 2. ...

    JAVA内存溢出

    JVM管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Heap space(堆区域)和Java Stacks(Java栈)。其中,永久保存区域主要存放Class(类)和Meta的信息,Class第一次被...

    java内存泄露、溢出检查方法和工具

    Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...

    java程序设计一堆栈

    Java程序设计中的“堆栈”是一种重要的数据结构,它遵循“后进先出”(LIFO)的原则。在计算机科学中,堆栈被广泛应用在各种算法和编程场景中,如函数调用、表达式求值、内存管理等。在Java中,我们可以使用...

    kettle内存溢出(Java heap space)以及解决方法.docx

    Java应用程序可以通过设置JVM的启动参数来控制堆的大小,例如`-Xms`和`-Xmx`分别用于设置初始堆大小和最大堆大小。 **Kettle内存溢出的原因** 1. **大数据量处理**:当Kettle处理大量数据时,如在表输入、表输出、...

    Java中堆内存和栈内存详解

    ### Java中堆内存和栈内存详解 #### 一、引言 在Java编程语言中,内存管理是一项核心技能。为了更好地理解和使用Java,必须清楚地了解堆内存与栈内存的区别及其工作原理。本文将深入探讨Java中堆内存与栈内存的概念...

    Java内存溢出解决办法

    Java虚拟机(JVM)将内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。其中,堆和栈是最常引发内存溢出的区域。 1. **堆内存...

    Java内存溢出的详细解决方案

    Java内存溢出是指Java虚拟机(JVM)中的内存使用超过了最大限制,导致程序崩溃或无法正常运行的错误。Java内存溢出主要有两种类型:PermGen space和Java heap space。 PermGen space PermGen space是Java虚拟机...

    栈溢出crash小合集

    本资源“栈溢出crash小合集”包含了作者通过自动化模糊测试工具AFL(American Fuzzy Lop)发现的一系列栈溢出导致的程序崩溃案例,非常适合用于学习和实践漏洞分析。 栈溢出通常发生在程序中当一个函数调用分配的栈...

    栈溢出攻击技术及实例代码

    栈溢出攻击是一种常见的安全漏洞利用技术,主要针对软件中的缓冲区溢出错误。栈是计算机内存中的一个重要区域,用于存储函数调用时的上下文信息,如返回地址、局部变量等。当程序员未正确处理数据长度,导致向栈中...

    java 内存中 堆、栈、常量池、方法区的总结

    在Java内存管理中,堆(Heap)、栈(Stack)、常量池(Constant Pool)和方法区(Method Area)是四个核心概念,它们在Java程序运行时扮演着不同的角色。 首先,方法区是用来存放类的信息、常量、静态变量等数据的...

    Java中堆内存与栈内存分配浅析

    了解Java中的堆和栈内存分配有助于优化程序性能,避免内存泄漏和内存溢出等问题。开发者应当合理使用堆和栈,确保对象的正确创建和销毁,同时注意内存的高效利用,以提高程序的运行效率。在编程实践中,通常建议尽...

Global site tag (gtag.js) - Google Analytics