我期待outOfMemory但是在这里我得到了java中的stackOverFlow

时间:2012-10-02 08:22:34

标签: java memory stack-overflow

package com.atul;

public class StackOverFlow {

    public StackOverFlow() {
        callStackOverFlow();
    }

    public void callStackOverFlow() {
        StackOverFlow st = new  StackOverFlow();
    }

    public static void main(String[] args) {
        StackOverFlow st2 = new StackOverFlow();
    }
}

在上面的程序中,我试图得到OutOfMemory错误但是我得到了StackOverFlow错误。据我所知,所有对象都是在堆中创建的。这里我们用构造函数进行递归,但仍然得到StackOverFlow错误。

为什么?

3 个答案:

答案 0 :(得分:7)

在堆内存用完之前很久就会耗尽堆栈(对于简单情况,其最大深度大约为10,000)。这是因为每个线程都有自己的堆栈,所以它必须比共享堆小很多。

如果您想耗尽内存,则需要更快地耗尽堆。

public class OutOfMemoryMain {
    byte[] bytes = new byte[100*1024*1024];
    OutOfMemoryMain main = new OutOfMemoryMain();

    public static void main(String... args) {
        new OutOfMemoryMain();
    }
}

答案 1 :(得分:1)

JVM中的堆栈大小受限(每个线程),可通过-Xss进行配置。

如果你想生成一个OOM,我会建议无限循环并在每个循环中实例化一个新对象,并将其存储在一个集合中(否则垃圾收集会破坏每个实例)

答案 2 :(得分:0)

由于内存不足,内存中充满了对象和程序中止;你没有存储方法调用的堆栈,因此你得到Stackoverflow错误。

当您的对象填满堆空间时会出现溢出错误...