StackOverflowError在全局创建对象时发生,为什么它不是OutOfMemoryError

时间:2018-03-27 21:10:43

标签: java

public class Abc {

Abc abc1=new Abc();
static Abc abc=new Abc();

public static void main(String[] args) {
        Abc abc=new Abc();
   }
}

对象存储在堆内存中,但是为什么我没有得到OutOfMemoryError?

2 个答案:

答案 0 :(得分:4)

您正在递归地构造这些对象。在option的构造函数中,它创建了一个新对象,该对象又调用它的构造函数。

您可以递归调用的次数大约是1,000到10,000次。您可以创建的对象数量为1,000,000到20,000,000。

简而言之,您在堆耗尽之前就会耗尽堆栈。

您可以添加

等字段
/* ----- JavaScript ----- */
$("#enqsave").on("click", function () {
  var
    /* Get the 'select' element. */
    select = $(this).closest("tr").find("select.input-sm")[0],
    
    /* Get the selected option and save its textContent. */
    textContent = select.selectedOptions[0].textContent;
  
  /* Log the value and textContent of the selected option. */
  console.log("value: ", select.value);
  console.log("textContent: ", textContent);
});

这样,在堆完用完之前,你可能会用完堆。

答案 1 :(得分:0)

因为在内存消失之前我记得大约56k的分辨率堆栈,如果你想测试它,请尝试在每个对象上创建一个ByteBuffer.create。

堆栈中有来自谁调用代码的信息(printStackTrace读取该堆栈以打印负责的代码)并限制它如何增加,这是因为在某些情况下需要用迭代替换递归。