簡體   English   中英

WeakReference、reachabilityFence 和 Java Memory Model

[英]WeakReference, reachabilityFence, and Java Memory Model

假設ref是一個 WeakReference object 指向(或在某個時刻已經指向)一個 object obj 如果調用ref.get()發生在(或至少在程序順序之前?)執行Reference.reachabilityFence(obj)之前,那么ref.get()的返回者是否有可能是null (另外,想通過隊列輪詢獲取ref ,替換掉關於通過ref.get()觀察null的部分之后再問這個問題。)

我問這個問題是因為我不太確定Reference#reachabilityFenceJava Memory Model方面是如何工作的,尤其是當它與WeakReference交互時。 據我所知,以下列表是與該主題相關的規范存在的所有地方:

問題是(c)和(d)中使用的術語與(a)和(b)中使用的術語相比模糊不清。

如果在開頭寫的問題的答案是肯定的,我怎樣才能讓所有的ref.get()調用發生在某個代碼點之前? 如果不是,我們如何根據 (a)(b)(c)(d) 或其他任何地方編寫的規范證明這一點?

雖然第一個問題的答案對我來說可能已經足夠了,但我也希望(c)和(d)中的規范變得清晰,所以讓我在下面提出更多問題。

首先,(c)WeakReference 表示在某個時間點gc 確定對象是弱可達的,同時清除弱引用,同時將這些對象聲明為可終結的。 根據(b2),可達性檢查和可終結性聲明發生在可達性決策點 所以“某個時間點”一定是可達性決策點之一,對吧 如果是這樣,就會出現其他問題。 (b2) 還說可達性決策點不是代碼或程序順序中的實際點(與寫入和讀取不同); 它們是虛擬點,僅通過前/后關系與動作相關,與程序順序無關。 所以......弱引用在決策點被清除,這不在代碼的任何地方。 它到底是什么意思 在什么情況下WeakReference#get()可以是 null? 不能是 null? 是我們需要的決策點和WeakReference#get()之間的先來后到關系嗎? 還是決策點與其他與WeakReference#get()具有某種內存模型相關關系的動作之間的先於/后關系?

接下來,(d)可達性圍欄。 它說調用這個方法保持了對象的強可達性,因此在調用之后它是不可回收的。 我可以將其解釋為調用保持對象的強可達性直到調用之后 從技術上講,它不是這樣說的。 但是,如果沒有關於何時保持強可達性的規范,那么保持強可達性的部分是無用的。 (而另一半談論未定義的概念“不可回收性”從一開始就沒有用。)所以強可達性一直保持到調用之后——但是“之后”這個詞到底是什么意思呢? 節目順序? 以前發生過嗎? 佣金發生的順序? 此外,我認為對象在(b2)中描述的某個決策點變得不可訪問。 什么決定了對reachabilityFence 的某個調用是否會影響某個決策點? 柵欄和決策點之間的先來后到關系? 顯然不是,因為柵欄的調用既不是寫也不是讀也不是同步動作,某個柵欄調用是在某個決策點之前還是之后沒有區別。

我懷疑(c)和(d)太模糊了,因此不可能像我的第一個問題那樣回答基本問題。

回答你的第一個問題:不。這正是文檔所說的:

確保給定引用所引用的 object保持強可達性,無論程序的任何先前操作可能導致 object 變得不可訪問 因此,至少在調用此方法之后,引用的object 不可通過垃圾收集回收

因此調用Reference.reachabilityFence(obj)會建立對objstrong reference obj被包裹在WeakReference中的內容並不重要(這樣“...可能會導致 object 變得無法訪問...”),它將保持強可訪問性。

我不確定您在某個時間點正在尋找什么,但這可能會有所幫助。 GC循環可能僅掃描(並因此發現弱引用)堆的部分區域。 它只能掃描某些區域(在像G1這樣的區域化收集器的情況下),因此只需跳過weak reference可能所在的區域。 這意味着弱引用的發現和清除是不確定的。 一些 GC 算法甚至已經安排了這些特殊引用的收集:即使他們現在發現它,他們可能會跳過在接下來的X個周期中清除它。 您可以有效地延遲清除此類引用( ShenandoahRefProcFrequency )。 發生,但不知道什么時候,也不知道在什么 GC 周期。

這可能就是可達性決策點 這個決定是在 GC 遇到這種特殊引用時做出的。

我也不確定after一詞的混淆來自哪里。 由於Reference.reachabilityFence(obj);的調用通常應該只發生在一種方法中,對我來說是程序順序,根據JLS也是happens-before關系。

暫無
暫無

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

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