2015-07-10 45 views
0

有沒有一點機會創建一個對象,並在它被分配給引用變量之前有資格進行垃圾回收。它會發生 - 創建對象並立即在java中收集垃圾

根據this標記有4個階段,最後階段Final Marking phase通過保持Java線程暫停來運行。現在線程創建一個對象並在將它分配給一個引用變量之前暫停Final Marking phase。現在在這個階段,它將對象識別爲活動對象,並且應該符合GC的條件。

會發生什麼:

  1. 如果對象是GCed,它創建它的線程,不會有 創建對象時,它恢復後。

  2. 如果該對象未被GCed, 是什麼使它逃脫被識別爲孤兒對象。

+2

我真的懷疑它。 JVM設計者會想到這一點。 –

+5

對一個極其複雜的過程進行簡單描述,然後試圖診斷線程安全問題就像是通過檢查[Up Goer 5的藍圖]來評估美國太空計劃的可行性(https:// xkcd的.com/1133 /)。這是徒勞的,浪費你的時間。 –

+2

這就是爲什麼我初始化我的對象:'Object o = null; while(o == null)o = new Object();' – Kayaman

回答

0

有沒有絲毫的機會

對於足夠馬車實現,充分魯莽開發商繞過VM驗證/安全網或invocations of C-x M-c M-butterfly:是的,當然。

另一方面,在一個完美的系統中,根據規範行爲和使用GC只允許在定義良好的一致執行狀態下進行。

0

你的想法是像

a = new A(); 

被作爲

new A(); 
a = 

因此,一個對象被創建執行,那麼a看到等號並查找要分配的東西。這對分配不起作用,你必須能夠獲得RHS,即該對象必須已經存儲在某個地方。在字節碼的情況下,這個地方是堆棧,所有線程堆棧都是GC根。