【问题标题】:Memory management of objects in javajava中对象的内存管理
【发布时间】:2013-08-05 09:51:44
【问题描述】:

我正在阅读这本关于数据结构的书,它涵盖了 Java 中的内存管理和孤立对象。教科书是这样说的:

例如,考虑图中的三个赋值语句 左。在第三个赋值语句之后,不仅 ab 引用 到同一个日期对象(1/1/2011),但也不再有 对创建并用于初始化的 Date 对象的引用 b。对该对象的唯一引用是在变量 b 中,而这个 引用被赋值覆盖了,所以没有办法 再次引用该对象。这样的对象被称为孤立对象。

代码:

Date a=new Date(12, 31, 1999);
Date b=new Date(1, 1, 2011);
b=a;

这句话是真的吗? a 的引用(对象Date(12, 31, 1999) 的内存位置不应该是 b 的引用吗?这似乎是一个巨大的错误,但甚至有一张图片显示 1999 年 12 月 31 日的内存块是孤立对象。

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

【问题讨论】:

  • 我明白你的意思。代码应为 a = b; 以使声明为真。
  • 是的,那本书中的说法是错误的吗?
  • Date(1, 1, 2011) 将被孤立,因为链接 b 指向 Date(12, 31, 1999)
  • 顺便问一下这是什么书?
  • algs4.cs.princeton.edu/errata/errata-printing1.php => 第 1 章,第104 已报告并为未来版本修复。

标签: java object memory memory-management reference


【解决方案1】:

在 java 中,您总是将 right 上的某些内容分配给对 left 的引用。

所以你的陈述是这样说的:

  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 被覆盖,现在对象Date(12, 31, 1999)ab 引用。 Date(91, 1, 2011)孤立并准备好被垃圾回收。

想象这就像你拿着一把剑和一把斧头。首先你拿起一把剑。然后你拿起斧头。之后你放下剑并用双手拖动你手中的斧头。之后,您不再握住掉落的剑(它丢失了)。

编辑:这是一个错误,如果您告诉本书的作者,他将不胜感激。

【讨论】:

  • +1 以剑为例! :-D 也许你应该用棍子代替第二把剑以避免阅读时混淆。
【解决方案2】:

b=a 语句丢弃了b 的当前值,并且由于没有其他对称为 b 的日期对象的引用,是的,b 日期是孤立的。

【讨论】:

    【解决方案3】:

    假设a 指的是存储在内存位置123 的日期对象。 按照相同的逻辑,假设b 指的是存储在内存位置546 的日期对象。(新对象新位置)。

    现在当你做b = ab 指的是Object @ 123546 不再可访问,可随时被 GC'ed。

    【讨论】:

      【解决方案4】:

      是的,

      (2011 年 1 月 1 日)

      文中写错了。 很可能是编辑错误。除此之外,其他一切都是正确的。 b 被 a 的内容覆盖,即 Date(12, 31, 1999)。因此两个变量都指向 Date(12, 31, 1999),而 Date(1, 1, 2011) 是孤立的,可以被垃圾回收。

      也许你应该检查你的书的勘误表。 :-)

      【讨论】:

      • 下次我会这样做的,你
      【解决方案5】:

      你是对的,孤立对象是b指向的对象,即Date(1, 1, 2011)。如果图片不是这样,那肯定是错的。

      a --> 31.12.1999     b --> 1.1.2011
      
                       |
                      \ /
      
      a --> 31.12.1999 <-- b     1.1.2011 (orphaned!)
      

      【讨论】:

        【解决方案6】:

        句子是假的(解释很好,但他混淆了对象)

        • 使用new Date(12, 31, 1999) 创建的对象被ab 引用了两次
        • new Date(91, 1, 2011) 创建的对象在b=a 赋值后没有被其他人引用,所以它会从内存中删除

        【讨论】:

          猜你喜欢
          • 2018-02-09
          • 1970-01-01
          • 2018-12-20
          • 1970-01-01
          • 2013-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多