在java中,当方法调用自身并导致无限循环时,会抛出stackoverflow错误。虽然在堆内存中初始化对象不应该抛出堆内存溢出错误,因为涉及一个对象来调用该方法。 是否存在堆溢流错误?!
答案 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。这取决于对象分配的大小,以及堆和堆栈的大小。