[英]Memory management of objects in java
我正在讀這本關於數據結構的書,它涵蓋了Java中的內存管理和孤立對象。教科書說明如下:
例如,考慮左圖中的三個賦值語句。 在第三個賦值語句之后,不僅a和b引用相同的Date對象(2011年1月1日),而且不再引用已創建並用於初始化b的Date對象。 對該對象的唯一引用是在變量b中 ,並且該引用被賦值覆蓋,因此無法再次引用該對象。 據說這樣的物體是孤兒。
碼:
Date a=new Date(12, 31, 1999);
Date b=new Date(1, 1, 2011);
b=a;
那句話是真的嗎? 不應該引用a(對象的內存位置Date(12, 31, 1999)
是b的引用嗎?這看起來像一個巨大的錯誤但是甚至有一張圖片顯示了12,31,1999的內存塊是孤兒。
在java中,您總是將右側的內容指定給左側的引用。
所以你的陳述說出這樣的話:
Date
對象Date(12, 31, 1999)
分配給變量a
Date
對象Date(91, 1, 2011)
分配給變量b
a
的引用分配給變量b
。 如果我遵循這些步驟,它看起來像這樣:
a
- > Date(12, 31, 1999)
a
- > Date(12, 31, 1999)
b
- > Date(1, 1, 2011)
a
- > Date(12, 31, 1999)
b
- > Date(12, 31, 1999)
請注意,在此作業完成后, Date(1, 1, 2011)
的原始對象不再被引用,因為您無法從應用程序中獲取它。 它的原始引用變量b
被覆蓋,現在從a
和b
引用對象Date(12, 31, 1999)
。 Date(91, 1, 2011)
是孤兒 ,准備垃圾收集。
想象一下,好像你拿着一把劍和一把斧頭。 首先你拿起一把劍。 然后你拿起斧頭。 之后,你放下劍,用雙手拖動你手中的斧頭。 在那之后你沒有握住你丟下的劍(它丟失了)。
編輯:如果你告訴作者這本書他會感激,這是一個錯誤。
在b=a
聲明放棄的當前值b
,並且因為有到被稱為B Date對象的任何其它引用,是的,B日期是孤立的。
你是對的,孤立的對象是b
指向的對象,即Date(1, 1, 2011)
。 如果圖片顯示不然,那肯定是錯的。
a --> 31.12.1999 b --> 1.1.2011
|
\ /
a --> 31.12.1999 <-- b 1.1.2011 (orphaned!)
是的,
(2011/1/1)
在文中是錯誤的。 這很可能是編輯錯誤。 除此之外,其他一切都是正確的。 b被a的內容覆蓋,即Date(12月31日,1999年)。 因此,兩個變量都指向Date(12月31日,1999年),而Date(1,1,2011)是孤立的,可以進行垃圾回收。
也許你應該查看你的書的勘誤。 :-)
讓我們說a
是指存儲在內存位置123
Date對象。 按照相同的邏輯,假設b
指的是存儲在存儲器位置546
Date對象。(新對象新位置)。
現在當你做b = a
。 b
指的是Object @ 123
。 546
不再可訪問,可以隨時進行GC。
句子是假的 (解釋很好,但他混淆了對象)
new Date(12, 31, 1999)
創建的對象被引用兩次, a
和b
b=a
分配之后,其他任何人都沒有引用使用new Date(91, 1, 2011)
創建的對象,因此它將從內存中刪除
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.