[英]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 個對象( Short
和c1
)符合 GC 的條件。
PS:正如 Andreas 所說, Short
值緩存在 -128 和 127 之間的值,因此在您的情況下,將重用相同的Short
實例。 所以只有一個對象有資格進行 GC。 如果您的Short
值超出該范圍,則 2 個對象將符合 GC 的條件。
Java 是按值傳遞的,因此當您將參數cb
null 時,不會更改變量c2
的值。
go()
方法調用最終只返回null
,而c1
和c2
保持不變。
因此,當執行到// do stuff
, c1
為空, c2
指的是第二個對象,而c3
為空。 這意味着第一個對象有資格進行 GC。
由於每個對象都有一個Short
引用,您會認為兩個對象將被釋放(第一個對象及其story
),兩個對象將保留(第二個對象及其story
),但事實並非如此。
Short
值為 5 不會創建Short
對象的新實例。 -128 和 127(含)之間的值被緩存,並且緩存值是永久的。
這意味着真正的答案是只分配了 2 個對象,並且第一個對象有資格進行 GC。 Short story
參考不分配任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.