簡體   English   中英

Java對象能否確定何時對其引用超出范圍?

[英]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()PhantomReferenceCleaner (Java 9中的新增功能)之類的機制,可用於檢測某個對象某個時間之前變得不可訪問 但是這些機制依賴於GC,並且檢測通常在“事件”變得不可達之后很長一段時間才會發生,並且它們不會告訴您涉及哪些參考變量。


存儲管理自動化程度較低的其他語言也提供了實現此目的的方法。 但是也有一個缺點。 例如,C ++智能指針將不會檢測到涉及對象循環的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM