分析堆转储我寻找 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
为什么 FileInputStream 和 FileOutputStream 总是在 ReferenceQueue 的尾部?
它们不是被垃圾收集器收集的,因为我只观察到分配失败 GC 而不是完全 GC 发生吗?
为什么描述符对他们来说总是 0 和 1?
倚天杖
相关分类