Java JVM上匿名变量的垃圾收集

Java JVM上匿名变量的垃圾收集,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我有一个理论上的问题,我找不到答案- 假设我有一个Singleton实例a,其中包含内部私有成员a和公共成员a setter,现在假设我从另一个 私有方法中的类类型B是某个事件的结果 i、 如果发生了什么事情,我将从B的私有方法调用A.setA(A) 我的问题是- 一旦B类实例中的使用结束,并且A类实例仍然“存在”在系统中, 类B的实例会被垃圾回收吗? 也就是说,如果B使用匿名成员初始化A的A 提前谢谢 编辑- 代码示例- public class A { Object a;

我有一个理论上的问题,我找不到答案-
假设我有一个Singleton实例a,其中包含内部私有成员a和公共成员a
setter,现在假设我从另一个
私有方法中的类类型B是某个事件的结果
i、 如果发生了什么事情,我将从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的私有成员之后完成的,从GC标准的基础上可以清楚地看出:垃圾收集器,或者只是收集器,尝试回收垃圾,或被程序不再使用的对象占用的内存

如果存在由超类表示的私有类属性,则该属性将与它与所用对象的任何关系一样存在

您可以很容易地跟踪这个实现您自己场景的过程,并通过jdk工具对其进行监控,因为一旦任何对象不再被视为活动对象,它就有资格被收集为垃圾

当另一个生命对象引用某个对象时,该对象是活动的。换句话说:只要B对象是从某处引用的,它就不能被收集。例如,见


在这里,B类中的代码在做什么完全无关紧要。唯一重要的是:B对象是否仍然从某个地方引用。从这个意义上说,您应该研究GC的一般工作原理,请参见示例。

请用代码演示示例,而不是试图用文字描述情况。我做了。.感谢您的注释类通常不会被垃圾收集。如果符合条件,实例可能是。你的意思是“B类将得到…”,还是“B类的实例将得到…”?我的意思是,B类的实例将得到GC,这是在这个特定实例中的使用结束后,它在系统中没有使用。我很欣赏快速恢复;-)最后这就是我一直在寻找的答案,B类的实例不是来自其他任何地方的引用,它执行API调用,并通过服务器响应调用决定是否调用setA——根据您的答案判断,一旦不再使用它,它将被GC接收。谢谢@crazyPixel我不确定您是否真正理解它,因为在您的评论中,您再次谈论的是与
B
实例的生命周期无关的
setA
调用。原则上,当
foo()
方法仍在执行时,
B
的实例甚至可以被垃圾收集,原因很简单,因为它在该方法中的任何地方都没有使用。我们确实需要一个规范的Q&a对,可以覆盖任何“这个对象是否会被GCed”问题。