循环构造函数对象循环java

odd*_*ity 1 java loops exception

首先它是一个堆栈溢出问题,我知道它已经溢出,因为创建了大量对象。但问题是我最初没有在引用中存储任何对象引用,所以为什么在使用资源并且没有对对象的引用时垃圾收集器不转储。

其次, 请参阅下面的那些 异常当代码中没有任何文件处理时,为什么会有这些FileOutputStream.write()异常?

class Base{
    Base(){
        Constructorloop c=new  Constructorloop();

    }
}

class Constructorloop{
    static int i=0;
    Constructorloop(){
        System.out.println(i+++" X 2 objects created");
        Base  b=new Base();
    }
    public static void main(String args[]){
        new Base();
    }
}

Run Code Online (Sandbox Code Playgroud)

例外:

Exception in thread "main" java.lang.StackOverflowError
        at java.io.FileOutputStream.write(Unknown Source)
        at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
        at java.io.BufferedOutputStream.flush(Unknown Source)
        at java.io.PrintStream.write(Unknown Source)
        at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
        at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source)
        at java.io.OutputStreamWriter.flushBuffer(Unknown Source)
        at java.io.PrintStream.write(Unknown Source)
        at java.io.PrintStream.print(Unknown Source)
        at java.io.PrintStream.println(Unknown Source)
        at Constructorloop.<init>(Constructorloop.java:11)
        at Base.<init>(Constructorloop.java:3)
        at Constructorloop.<init>(Constructorloop.java:12)
        at Base.<init>(Constructorloop.java:3)
        at Constructorloop.<init>(Constructorloop.java:12)
Run Code Online (Sandbox Code Playgroud)

Ale*_*ijk 5

您部分正确地观察到堆栈溢出错误是因为您在循环中创建了许多对象。至于垃圾收集器:它不会连续运行。相反,它等待一个合适的时机。您可能不会保存对您正在创建的对象的引用,但引用仍然放置在堆栈中(尽管对象本身位于堆中)。更重要的是,调用一个函数,每次调用都会在堆栈上重复放置一个返回引用,因此导致堆栈溢出异常的甚至可能不是对象创建。

至于FileOutputStream: 在你的无限循环中的异常,System.out.println被重复调用并使用流作为其输出。在内部,它将通过调用其他方法调用方法,所有这些都添加到您的堆栈中,直到它用完堆栈空间。

总而言之,无论您是否创建对象实例,调用自身的函数的无限循环总是会耗尽堆栈空间。