第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

終結器線程等待時 java.util.ref.Finalizer 的內存泄漏

終結器線程等待時 java.util.ref.Finalizer 的內存泄漏

幕布斯7119047 2022-06-30 18:03:21
分析堆轉儲我尋找 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 發(fā)生嗎?為什么描述符對他們來說總是 0 和 1?
查看完整描述

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 版本,您應該只看到堆轉儲中實際使用的流的清理程序。


查看完整回答
反對 回復 2022-06-30
  • 1 回答
  • 0 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號