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错误。
为什么?
答案 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错误。
当您的对象填满堆空间时会出现溢出错误...