1 回答
TA贡献1828条经验 获得超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 系统
换句话说,您正在查看由System.inand封装的文件流System.out,当然,它们永远不会被垃圾收集,通常您也不会调用close()它们。
终结不支持任何类型的选择退出,因此任何具有“非平凡finalize()方法”的类实例都将在构造时获得终结器引用,即使创建者知道对象永远不会被终结。
最新的 JDK 版本Cleaner为此使用 a ,这允许在使用现有的FileInputStream或构造时不注册清洁器,标准输入和标准输出就是这种情况。它还允许立即清理并因此在该方法中注销,不需要对表现良好的程序进行任何事后清理。FileOutputStreamFileDescriptorclose()
因此,对于最新的 Java 版本,您应该只看到堆转储中实际使用的流的清理程序。
添加回答
举报