[英]Can a Java object tell when a reference to it goes out of scope?
我正在幻想一種檢測資源泄漏的工具。 我有一個很好的主意,該工具的外觀和要求是什么,但是我缺乏使它起作用的難題:當引用超出范圍時發生的事件。
該工具將按以下方式工作:創建一個closeable時,該工具將在其周圍構建包裝器。 調用close()時,包裝器將對象標記為關閉。 當對象成為垃圾回收對象時,如果尚未關閉該對象,它將傳遞當前線程的堆棧跟蹤,從而確定我們在代碼中的哪個位置放棄了該對象而不關閉它。
聽起來不錯,但是當引用超出范圍時,我還沒有發現任何事件發生。 有定稿和幻影參考事件,但是在有罪方已經撤離犯罪現場之后,它們發生在不同的線程中。 我需要類似在引用發布時可以覆蓋的方法。
對我有什么想法嗎?
TIA-蒂姆
嚴格來說,引用不會超出范圍。 變量超出范圍。 引用是值...並且沒有范圍。
Java中沒有一種機制可以在任何包含其引用的引用變量超出范圍時通知對象(或管理器)。 最接近的try-with-resources將在try塊終止時自動對已聲明的資源變量調用close()
。 (但是,這很可能無法幫助您發現要檢測的案件。)
Java中沒有機制允許對象(或管理器)無法訪問時得到通知。 有諸如finalize()
, PhantomReference
和Cleaner
(Java 9中的新增功能)之類的機制,可用於檢測某個對象在某個時間之前變得不可訪問 。 但是這些機制依賴於GC,並且檢測通常在“事件”變得不可達之后很長一段時間才會發生,並且它們不會告訴您涉及哪些參考變量。
存儲管理自動化程度較低的其他語言也提供了實現此目的的方法。 但是也有一個缺點。 例如,C ++智能指針將不會檢測到涉及對象循環的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.