Heapoverflow而不是无限循环中的Stackoverflow

时间:2014-10-20 04:11:19

标签: java object stack heap stack-overflow

在java中,当方法调用自身并导致无限循环时,会抛出stackoverflow错误。虽然在堆内存中初始化对象不应该抛出堆内存溢出错误,因为涉及一个对象来调用该方法。 是否存在堆溢流错误?!

3 个答案:

答案 0 :(得分:4)

如果你做

  • 您的筹码量足够大,和/或
  • 你的堆大小足够小,

您将收到堆溢出错误(java.lang.OutOfMemoryError),而不是堆栈溢出错误(java.lang.StackOverflowError)。

您通常不会看到此行为的原因是,默认情况下(取决于JVM),堆栈大小比堆大小小得多,因此堆栈首先耗尽。

您可以通过创建递归方法并使用不同的堆和堆栈大小来尝试它。例如,以下内容将执行MyClass,堆大小为2MB,堆栈大小为4MB。如果调用MyClass执行涉及对象创建的无限递归方法,则在遇到OutOfMemoryError之前,您必须遇到StackOverflowError

java -Xms2m -Xmx2m -Xss4m MyClass

答案 1 :(得分:2)

你走在正确的轨道上。您可以用尽堆内存,但它不会被称为HeapOverflow。它被称为OutOfMemoryError。 尽管HeapOverflow听起来很吸引人,但并不是因为堆通常具有分散的空闲和分配区域。另一方面,堆栈只有两个区域,空闲和分配。当您在堆栈上进行更多分配时,分配的区域会增长到空闲区域。因此,您最终会溢出堆栈。更多关于堆栈与堆here

以下是堆内存耗尽的示例:

public class RunOutOfMemory {
    public static void main(String[] args){
        System.out.println("Haven't tried to allocate lots of heap memory.");
        int[][] matrix = new int[100000][100000000];
        System.out.println("A miracle occured.");
    }
}

扰流警报:你需要大约4TB的内存才能发生奇迹

答案 2 :(得分:0)

如果Java在尝试分配对象时用完了堆空间,则会出现OutOfMemoryError

http://docs.oracle.com/javase/7/docs/api/java/lang/OutOfMemoryError.html

  

虽然在堆内存中初始化对象不应该抛出堆内存溢出错误,因为涉及一个对象来调用该方法。?

如果你有一个无限递归函数也可以从堆中分配一个对象,那么可以先得到一个OutOfMemoryError。这取决于对象分配的大小,以及堆和堆栈的大小。