1 回答

TA貢獻1828條經(jīng)驗 獲得超3個贊
也許下面的測試程序會對此有所了解:
Field fd = FileDescriptor.class.getDeclaredField("fd");
fd.setAccessible(true);
System.out.println("stdin: "+fd.get(FileDescriptor.in));
System.out.println("stdout: "+fd.get(FileDescriptor.out));
System.out.println("stderr: "+fd.get(FileDescriptor.err));
stdin: 0
stdout: 1
stderr: 2
Ideone,請注意,對于 JDK 8,這僅適用于類 Unix 系統(tǒng)
換句話說,您正在查看由System.inand封裝的文件流System.out,當然,它們永遠不會被垃圾收集,通常您也不會調用close()它們。
終結不支持任何類型的選擇退出,因此任何具有“非平凡finalize()方法”的類實例都將在構造時獲得終結器引用,即使創(chuàng)建者知道對象永遠不會被終結。
最新的 JDK 版本Cleaner為此使用 a ,這允許在使用現(xiàn)有的FileInputStream或構造時不注冊清潔器,標準輸入和標準輸出就是這種情況。它還允許立即清理并因此在該方法中注銷,不需要對表現(xiàn)良好的程序進行任何事后清理。FileOutputStreamFileDescriptorclose()
因此,對于最新的 Java 版本,您應該只看到堆轉儲中實際使用的流的清理程序。
添加回答
舉報