【问题标题】:What happens when an object is dereferenced but its member object is still referenced?当一个对象被取消引用但它的成员对象仍然被引用时会发生什么?
【发布时间】:2015-01-04 12:22:31
【问题描述】:
class ClassA {
    ClassB mem1 = new ClassB();
    ClassB mem2 = new ClassB();
}

class ClassB {
}

public class Sample {
    public static void main(String[] args) {
        ClassA obj1 = new ClassA();
        ClassB obj2 = obj1.mem1;

        obj1 = null;

        obj2 = null;
    }
}

在上面的程序中,在obj1 = null这一行之后会发生什么?

obj1 是否已准备好进行垃圾回收,即使它的一个成员对象仍在被引用?

【问题讨论】:

  • 它们无法再访问了。
  • 它有资格获得 GC
  • obj1 已准备好进行 GC,但 obj2 通过 main 中的第二个引用保持活动状态。
  • obj1 可以被 GC - 但 obj2 == mem1 不能被 GC。 Java 只是一个大的参考图——你可以剪掉图的一部分,但可以在其他地方引用节点。您可以将其视为由根节点(天花板)的引用(字符串)悬挂的权重。当您 null 引用时,您会剪断字符串。如果没有更多的绳子支撑重物,那么它就会掉到地板上 (GC)。

标签: java


【解决方案1】:

自动垃圾回收是查看堆内存,识别哪些对象正在使用,哪些没有,并删除未使用的对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。所以可以回收未引用对象使用的内存。

Java Garbage Collection Basics

在这种情况下,当处理obj1 = null; 时,没有对它指向的ClassA 类型对象的引用,因此它可以进行垃圾回收。 ClassB 对象 mem1 但是仍然有 obj2 形式的引用,因此至少会保留到 obj2 = null; 行被执行。

【讨论】:

    【解决方案2】:

    obj1 不再被引用后,它就可以进行垃圾回收了。 mem1 仍然有一个引用,所以如果 java 在此时进行垃圾收集,obj1mem2 它指向的也会被释放,但 mem1 将保持不变,因为 obj2 仍然指向它。

    当然obj2 = null之后也可以收藏。

    【讨论】:

      【解决方案3】:

      您有 3 个类实例:ClassA 之一(我称之为 classA_1)和 ClassB 中的两个(classB_1classB_2)。现在查看这 3 个实例存在的所有引用路径。

      obj1 = null 之前,它看起来很诡异。像这样:

      classA_1 <- Sample.main.obj1
      classB_1 <- classA_1.mem1 <- Sample.main.obj1
      classB_1 <- Sample.main.obj2
      classB_2 <- classA_1.mem2 <- Sample.main.obj1
      

      obj1 = null 之后看起来像这样,其中no ref. 表示它有资格进行垃圾回收,因为它没有指向它的引用。

      classA_1 <- no ref.
      classB_1 <- classA_1.mem1 <- no ref.
      classB_1 <- Sample.main.obj2
      classB_2 <- classA_1.mem2 <- no ref.
      

      剩下的唯一路径是:classB_1 &lt;- Sample.main.obj2。没有有效引用对象classB_2classA_1 的路径。这样就可以收集这些对象了。

      【讨论】:

        猜你喜欢
        • 2022-06-27
        • 2016-04-29
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多