我有一个理论问题我无法找到答案 -
假设我有一个带有内部私有成员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的私有成员后完成了它的部分
答案 0 :(得分:1)
任何对象一旦不再被视为 alive 就有资格被收集为垃圾。
当另一个生命对象引用该对象时,该对象 alive 。换句话说:只要从某处引用该B对象,就无法收集它。例如,请参阅here。
这里B类中的代码在做什么并不重要。唯一重要的是:B对象仍然是从某个地方引用的。从这个意义上讲,您应该更好地研究GC的工作原理,例如,请参阅here。
答案 1 :(得分:0)
从GC标准的基础知识中可以清楚地看出:垃圾收集器或者只是收集器,试图回收垃圾或由程序不再使用的对象占用的内存。
如果有一个私有类属性由超类实现,那么它将与它与使用过的对象的任何关系一样长。
您可以轻松跟踪此实现您自己的方案,并通过jdk工具监控,以Java Mission Control