gpt4 book ai didi

java - 为什么这段代码抛出 StackOverflowException 而不是 OutOfMemoryException?

转载 作者:行者123 更新时间:2023-12-01 23:29:39 25 4
gpt4 key购买 nike

由于嵌套构造函数调用,我有以下代码及其抛出 StackOverflowException,并且我知道仅当构造函数成功运行时才会分配内存。

package interview;

public class StackOverflow {
int i;
StackOverflow()
{
System.out.println(" i= "+i);
System.out.println("in Constructor");
StackOverflow sOf = new StackOverflow();
sOf.i=5;
System.out.println(" i= "+i);
}
public static void main(String[] args) {
System.out.println("in main");
StackOverflow s = new StackOverflow();
s.i=10;
System.out.println(" i= "+s.i);
}

}

所以我的疑问是“i”的值发生了什么?它是否存储在堆栈或堆中的某个位置?在什么情况下上面的代码会抛出以下异常?

OutOfMemoryException

最佳答案

OutOfMemoryError:当 Java 虚拟机因内存不足而无法分配对象且垃圾收集器无法提供更多内存时抛出该错误。

StackOverflowError:由于应用程序递归太深而发生堆栈溢出时抛出。

in which case it can throw OutOfMemoryError?

  • 你的构造函数正在递归地调用自身,进入更深层,在 JVM 内存不足之前堆栈溢出。

    使用for循环而不是递归来创建过多的对象。你也许能够看到 OutOfMemoryError

My question is what is happening to the value of i( it is getting stored heap or stack):

  • JVM specification-2.5.2明确指出:

    A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return.

    由于堆是对象的存储,而 i 是对象的字段成员StackOverflow 类,它存储在 Heap

关于java - 为什么这段代码抛出 StackOverflowException 而不是 OutOfMemoryException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19532661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com