簡體   English   中英

java中對象的內存管理

[英]Memory management of objects in java

我正在讀這本關於數據結構的書,它涵蓋了Java中的內存管理和孤立對象。教科書說明如下:

例如,考慮左圖中的三個賦值語句。 在第三個賦值語句之后,不僅ab引用相同的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的內存塊是孤兒。

圖片: http//imageshack.us/f/818/3tkx.jpg/

在java中,您總是將右側的內容指定給左側的引用。

所以你的陳述說出這樣的話:

  1. 將新的Date對象Date(12, 31, 1999)分配給變量a
  2. 將新Date對象Date(91, 1, 2011)分配給變量b
  3. 將變量a的引用分配給變量b

如果我遵循這些步驟,它看起來像這樣:

  1. a - > Date(12, 31, 1999)

  2. a - > Date(12, 31, 1999) b - > Date(1, 1, 2011)

  3. a - > Date(12, 31, 1999) b - > Date(12, 31, 1999)

請注意,在此作業完成后, Date(1, 1, 2011)的原始對象不再被引用,因為您無法從應用程序中獲取它。 它的原始引用變量b被覆蓋,現在從ab引用對象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)創建的對象被引用兩次, ab
  • b=a分配之后,其他任何人都沒有引用使用new Date(91, 1, 2011)創建的對象,因此它將從內存中刪除

暫無
暫無

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

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