【发布时间】:2019-07-16 07:07:46
【问题描述】:
分析堆转储我寻找 java.lang.ref.Finalizer 类的实例。 java.lang.ref.Finalizer 有 'next' 和 'prev' 成员字段用于维护链表。我总是将 FileInputStream 作为列表的尾部,并将 FileOutputStream 作为它的前一个条目(分析了几个堆转储)。 FileInputStream 和 FileOutputStream 的文件描述符总是分别为 0 和 1:
+---[Pending Finalization] java.lang.ref.Finalizer
| |
| +---queue java.lang.ref.ReferenceQueue [Stack Local]
| |
| +---referent java.io.FileInputStream
| | |
| | +---closed = boolean false
| | |
| | +---closeLock java.lang.Object
| | |
| | +---fd java.io.FileDescriptor
| | |
| | +---closed = boolean false
| | |
| | +---fd = int 0
| | |
| | +---parent java.io.FileInputStream
| |
| +---prev [Pending Finalization] java.lang.ref.Finalizer
| |
| +---queue java.lang.ref.ReferenceQueue [Stack Local]
| |
| +---next [Pending Finalization] java.lang.ref.Finalizer
| |
| +---referent java.io.FileOutputStream
| | |
| | +---append = boolean false
| | |
| | +---closed = boolean false
| | |
| | +---closeLock java.lang.Object
| | |
| | +---fd java.io.FileDescriptor
| | |
| | +---closed = boolean false
| | |
| | +---fd = int 1 0x00000001
| | |
| | +---parent java.io.FileOutputStream
| |
| +---prev [Pending Finalization] java.lang.ref.Finalizer
- 为什么 FileInputStream 和 FileOutputStream 总是在 ReferenceQueue 的尾部?
- 它们不是被垃圾收集器收集的吗,因为我观察到的只是分配失败 GC 而不是完全 GC?
- 为什么描述符对它们来说总是 0 和 1?
【问题讨论】:
-
您正在泄漏文件输入和输出流。解决方法:不要。
-
@user207421,很遗憾,您的回复看起来不像是对这 3 个问题的回答。
标签: java memory garbage-collection jvm finalize