Java面试题:写代码使得分别出现*Error和OutOfMemoryError

时间:2023-03-08 22:05:35
Java面试题:写代码使得分别出现*Error和OutOfMemoryError

转载自:http://www.cnblogs.com/xudong-bupt/p/3360206.html

今天做了个笔试,这是其中的一道题目:写代码使得分别出现*Error和OutOfMemoryError

1.*Error

  堆栈溢出错误一般是递归调用嘛。下面的代码就可以出现:

Java面试题:写代码使得分别出现*Error和OutOfMemoryError
package T20131009;
public class *Test {
    public static void main(String[] args) {
        method();
    }
    public static void method(){
        for(;;)
            method();
    }
}
Java面试题:写代码使得分别出现*Error和OutOfMemoryError

运行结果:

  Java面试题:写代码使得分别出现*Error和OutOfMemoryError

深入分析:JVM 虚拟内存分为 堆内存和 栈内存,而栈内存存储的是局部变量和方法调用,因此如果要让程序发生 *Error,即栈溢出的话。那么最简单的方法就是将栈塞满,也就是递归调用方法,不断往栈里面塞入信息。这样到一定程度,栈就爆了。有的人问了,那我往栈里塞局部变量行不行,这个应该可行,不过好像很少这么做。我猜原因应该是:局部变量所需要的存储空间很小,而方法调用需要存储的除了方法调用地址之外,可能还要保存现场信息,所以需要的存储空间也多一些,从而也更容易发生栈溢出。

 2.OutOfMemoryError

  内存溢出一般是出现在申请了较多的内存空间没有释放的情形。下面的代码就可以出现:

Java面试题:写代码使得分别出现*Error和OutOfMemoryError
package T20131009;
import java.util.ArrayList;
import java.util.List;
public class OutOfMemoryTest {
    public static void main(String[] args){
        List list=new ArrayList();
        for(;;){
            int[] tmp=new int[1000000];
            list.add(tmp);
        }
    }
}
Java面试题:写代码使得分别出现*Error和OutOfMemoryError

运行结果:

Java面试题:写代码使得分别出现*Error和OutOfMemoryError

深度解析:JVM 虚拟内存分为 堆内存和 栈内存,对象的具体内容是存储在堆内存的。当堆内存不足的时候就会发生 OutOfMemoryError,即内存不足。因此当我们存储的数据太多,塞满堆内存的时候,就会报这个错误。本例就是通过往堆内存塞很大的数组来实现 OutOfMemoryError 的。