簡體   English   中英

作為參數傳遞並在方法中設置為 null 的對象的垃圾收集

[英]Garbage Collection of Objects passed as arguments and being set to null in a method

我一直試圖理解這個問題,但無法解決書中提供的答案。 有人可以向我解釋一下嗎? 問題如下。

class CardBoard {
  Short story = 5;

  CardBoard go(CardBoard cb) {
    cb = null;
    return cb;
  }

  public static void main(String[] args) {
    CardBoard c1 = new CardBoard();
    CardBoard c2 = new CardBoard();
    CardBoard c3 = c1.go(c2);
    c1 = null;
    // do stuff
  }
}

// 當達到 do stuff 時,有多少對象可以進行垃圾回收?

給出的答案是2 個對象。 只有一個 CardBoard 對象 (c1) 符合條件,但它有一個相關的 Short 包裝對象也符合條件

我不明白為什么只有對象 c1 才有資格進行垃圾收集。

創建了兩個對象,c1 和 c2。

對於對象 c3,我們將 c2 傳遞給 c1.go() 方法。 並將其設置為 null 並將返回的對象分配給 c3。

在方法 c1.go() 中,cb 所指的對象(據我所知,與 c2 所指的對象相同)被設置為 null。 這不會使 c2 所指的對象也可用於垃圾收集嗎?

Java 是按值傳遞的 當你做CardBoard c3 = c1.go(c2); c2指向的實例被傳遞給go()但是當你做cb=null ,原始c2's cb沒有設置為null ,一個新的空引用aconst_null被推送到堆棧上並返回。 因此,只有 2 個對象( Shortc1 )符合 GC 的條件。

PS:正如 Andreas 所說, Short值緩存在 -128 和 127 之間的值,因此在您的情況下,將重用相同的Short實例。 所以只有一個對象有資格進行 GC。 如果您的Short值超出該范圍,則 2 個對象將符合 GC 的條件。

Java 是按值傳遞的,因此當您將參數cb null 時,不會更改變量c2的值。

go()方法調用最終只返回null ,而c1c2保持不變。

因此,當執行到// do stuffc1為空, c2指的是第二個對象,而c3為空。 這意味着第一個對象有資格進行 GC。


由於每個對象都有一個Short引用,您會認為兩個對象將被釋放(第一個對象及其story ),兩個對象將保留(第二個對象及其story ),但事實並非如此。

Short值為 5 不會創建Short對象的新實例。 -128 和 127(含)之間的值被緩存,並且緩存值是永久的。

這意味着真正的答案是只分配了 2 個對象,並且第一個對象有資格進行 GC。 Short story參考不分配任何東西。

暫無
暫無

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

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