【问题标题】:what is meant by obsolete reference in java?java中过时的引用是什么意思?
【发布时间】:2011-07-27 10:50:43
【问题描述】:

我正在阅读Effective Java,我遇到了这个术语,“过时的参考”。 参考什么时候是过时参考?我假设所有未超出范围且未使用的对象都是过时的引用。如果我错了,请纠正我。

【问题讨论】:

  • 在书中的 pop() 方法示例(例如“return elements[--size];”)中,它基本上返回一个对象,通过玩计数器来调整数组的大小(例如“ --size"),但它并没有真正调整数组的大小 - 数组仍然包含对象引用。为了使其可用于 GC,它还应该将该索引标记为 null。

标签: java garbage-collection reference


【解决方案1】:

过时的引用(正如书中所用,虽然它不是一个广泛使用的技术术语)是一个被保留但永远不会被使用的引用,它阻止它引用的对象有资格进行垃圾回收,从而导致内存泄漏。

【讨论】:

    【解决方案2】:

    过时的引用只是一个永远不会被取消引用的引用。

    来自Effective Java

    在 Java 中保留过时的引用 constitutes memory leaks。 这也称为无意的对象保留。

    取消引用以删除对对象的过时引用是 很好,但不能做得过火。最好的方法来消除 过时的引用是重用它所在的变量 或者让它超出范围。

    例如删除过时的引用,

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null; // Eliminate obsolete reference
        return result;
    }
    

    【讨论】:

    • 在 Effective Java 中提到“每当一个类管理自己的内存时,程序员应该警惕内存泄漏”。这是否意味着类中的所有引用变量都被程序员取消了?跨度>
    【解决方案3】:

    你是对的。基本上,过时的引用不会影响程序的后续流程,应该设置为 null 以帮助垃圾回收。

    例如;

    String a="某个值"; . . . . . . //这里有些处理 //一旦完成就这样做 一个=空; //a 是过时的引用

    【讨论】:

      【解决方案4】:

      未使用的对象,仍然有引用(可能不是故意的)并且这些引用没有被您的应用程序/程序/代码引用,那么该引用是过时的引用。由于这些未使用对象的引用仍然是它们的引用,因此这些对象和这些对象内部的对象无法进行 GC,这会导致内存泄漏问题。

      【讨论】:

        【解决方案5】:

        一个简单的解释是,即使该值从方法中弹出,该值仍由其索引指向数组内部。所以即使程序真的处理完传递的引用副本,由于堆栈中使用了元素数组,它仍然会在堆中。

        【讨论】:

          猜你喜欢
          • 2019-01-23
          • 1970-01-01
          • 2012-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-22
          相关资源
          最近更新 更多