簡體   English   中英

Java垃圾收集器在這里如何工作?

[英]How does Java garbage collector work here?

在此查詢中, remove()方法具有以下實現。

 /**
   *  remove() removes "node" from this DList.  If "node" is null, do nothing.
   *  Performance:  runs in O(1) time.
   */
  public void remove(DListNode node) {
    if((node != null) && (node.listp == this)){
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }
    this.size--;
  }

執行此remove()方法后,將沒有任何指向對象的向內指針,除非DList類的用戶仍使用某些引用變量指向此節點。

我的問題:

沒有引用指針指向該對象后,垃圾收集器何時以及如何將其垃圾處理? 因為GC如何在沒有任何引用的情況下控制該對象?

不再強烈可達對象之后的任何時候,都可以對其進行GC /回收。 當且僅當可以從GC根目錄(通過強引用)訪問該對象時,該對象才是高度可訪問的。 也就是說,GC回收對象( 如果選擇回收的對象)僅是無法訪問該對象的結果。

現在,Java保證的一件事是, 它將在拋出OOM之前盡其最大努力 (可能不采取任何措施)釋放內存。

即使代碼中沒有強大的引用,也並不意味着JVM不會跟蹤對象或對象消失了! 該對象仍然存在 -盡管它不是強可到達(讀:不可訪問)從用戶代碼-直到/當這種實際GC'ed。

例如,這允許一些有趣的情況。

未定義。 下次垃圾收集器運行時可能會發生這種情況(只有當垃圾收集器運行時它才會高興),但這不能保證-並非每次gc運行都必須清除所有垃圾

Java的GC一旦不再使用它就不會丟棄對象。 相反,GC會不時運行,檢查對象的使用情況並清空內存。

您不能告訴GC任意運行,但是可以通過調用System.gc()來請求它運行。 但是,調用gc()不會在此時間運行GC ...它將僅請求系統運行它。

暫無
暫無

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

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