簡體   English   中英

在什么行可以將此對象視為垃圾回收。 爪哇

[英]At what line can this object be considered to be garbage collected. Java

因此,我的理解是在第1行,創建了一個新對象,它由obj引用。 在第2行,obj引用了另一個新對象。 因此我們在第1行創建的對象可以進行垃圾回收,因為任何實例均未引用該對象。 但是測試問題的答案在第3行。原因? 答案正確嗎?

Object obj = new Object();  //line 1
obj = new Object();  //line 2
obj = null;  //3

編輯:詢問在第1行創建的對象何時可以進行垃圾收集。

在現實世界中,這個問題(由標題引起)沒有明確的答案。

  • 積極的死代碼消除可以消除第一個對象分配,因為它從不可見
  • 修改后的對象類(例如,通過字節碼檢測或引導程序類加載器)可以在完成時恢復自身,或者無限期保留其他引用
  • 垃圾回收是異步的,並且將來會在不確定的時間發生,因此,盡管從Java代碼中無法訪問對象,但在實際進行垃圾回收之前,不能“考慮”垃圾回收。
    它最終可能會顯示在堆轉儲中,如果它包含安全敏感的數據,則可能是相關的

我知道這應該是一個帶有簡單答案的學術性問題,但是有很多假設可以使我可以對想要存在的任何答案進行法律裁決。

即使我們沒有從帽子中拉出任何兔子,答案仍將取決於“在第X行”是指執行該命令之前還是之后

垃圾收集器正在檢查活動對象,並丟棄不存在的任何對象。 創建obj ,要定義它的類型,因為它使編譯器知道要為該地址分配多少空間,因為Type Object將在那里存在。 當第二行執行時,new將創建該對象的全新實例,並且您將其地址分配給obj 因此,在將obj重新分配為引用新對象之后,舊對象仍然存在,但不再被引用。 它可能會被標記為要收集,因為它占用了堆中的空間,但是不再處於活動狀態。 第3行也一樣,除了前面提到的,您要為其分配的地址為null ,並且沒有創建新對象。 因此,以前由obj引用的obj現在是死對象,而垃圾回收人員將其刪除。

暫無
暫無

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

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