首先,这是一个流堆栈问题,我知道由于创建了大量对象,它已经过度飞行。 但问题是我最初没有在引用中存储任何对象引用,那么为什么在使用资源并且没有对对象的引用时不进行垃圾收集器转储。
其次,请参阅下面的那些异常,为什么当代码中没有任何文件处理时,这些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 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
被反复调用,它使用流作为其输出。在内部,它将调用方法并调用其他方法,所有这些方法都添加到您的堆栈中,直到耗尽堆栈空间。
总之,调用自己的函数的无限循环将始终耗尽堆栈空间,无论您是否正在创建对象实例。