JVM上的匿名变量垃圾收集

时间:2018-01-26 12:50:33

标签: java garbage-collection jvm

我有一个理论问题我无法找到答案 -
假设我有一个带有内部私有成员a和公共的singelton实例A.
setter,现在我假设我从另一个实例设置了这个成员 作为某种事件的结果,类型B在私有方法中
即如果发生了什么事我将从B的私人方法中调用A.setA(a)。


我的问题是 -
一旦B类实例的使用结束,A类实例仍然“存在”系统中,
B类的实例会被垃圾收集吗?
即如果B使用匿名成员来初始化A是a。

提前致谢。

编辑 - 代码示例 -

public class A {
    Object a;

    public void setA(Object a) {
        this.a = a;
    }
}

public class B {

    private void foo() {
        if(...condition) {
            A.getInstance().setA(new Object());
        }
    }

}

为了进一步解释 - 类A的实例是系统中的单例,没有其他类引用类B的实例,并且它在设置A的私有成员后完成了它的部分

2 个答案:

答案 0 :(得分:1)

任何对象一旦不再被视为 alive 就有资格被收集为垃圾。

另一个生命对象引用该对象时,该对象 alive 。换句话说:只要从某处引用该B对象,就无法收集它。例如,请参阅here

这里B类中的代码在做什么并不重要。唯一重要的是:B对象仍然是从某个地方引用的。从这个意义上讲,您应该更好地研究GC的工作原理,例如,请参阅here

答案 1 :(得分:0)

从GC标准的基础知识中可以清楚地看出:垃圾收集器或者只是收集器,试图回收垃圾或由程序不再使用的对象占用的内存。

如果有一个私有类属性由超类实现,那么它将与它与使用过的对象的任何关系一样长。

您可以轻松跟踪此实现您自己的方案,并通过jdk工具监控,以Java Mission Control