首先它是一个堆栈溢出问题,我知道它已经溢出,因为创建了大量对象。 但问题是,我最初没有在引用中存储任何对象引用,所以当资源被使用且没有对象引用时,为什么垃圾收集器不转储。
其次 请参阅下面的那些异常当代码中没有任何文件处理时,为什么会出现那些 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();
}
}
异常(exception)情况:
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)
最佳答案
您部分正确地观察到堆栈溢出错误是由于您在循环中创建许多对象而导致的。至于垃圾收集器:它不会连续运行。而是等待一个合适的时机。您可能没有保存对您正在创建的对象的引用,但引用仍然放在堆栈中(尽管对象本身位于堆中)。而且,重复调用一个函数会在每次调用时在堆栈上放置一个返回引用,因此甚至可能不是对象创建导致堆栈溢出异常。
至于 FileOutputStream
中的异常:在无限循环中,System.out.println
被重复调用,它使用流作为输出。在内部,它将调用方法和调用其他方法,所有这些都添加到您的堆栈中,直到用完堆栈空间。
总而言之,无论您是否正在创建对象实例,函数调用自身的无限循环总是会耗尽堆栈空间。
关于java - 循环构造函数对象循环java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59471059/