[英]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.