繁体   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