匿名对象创建和 GC

Anonymous object Creation and GC

匿名对象如何使用,例如 return 语句:
return new JsonObject().put("name","xyz") 分配在堆中?由于它们没有任何命名引用,垃圾收集器如何从内存中清除它们?我试图寻找答案,但找不到答案,所以张贴在这里。

这里有类似的问题; and a pretty good description here http://viralpatel.net/blogs/inner-classes-in-java/

注意这一行;

An object of an inner class has an implicit reference to the outer class object that instantiated it.

你可以在一个简单的测试中看到这一点;

    public class Frame1
    {
            public class JsonObject
            {
                    int field1 = 123;
                    int field2 = 456;

                    public JsonObject() { }
            }

            // code that callSomething()
            // ...

            private Object callSomething()
            {
                    return new JsonObject();
            }
    }

我在 return 行添加了一个断点,并允许代码步进足够远,以便创建 JsonObject。然后在附加 JVisualVM 并查看我看到的堆上唯一的 JsonObject 实例之后;

有外层引用Frame1class

如果一个实例在代码中不可用(可达),那么它就死了。当 gc 运行时,它识别 活动集 ,而不是死对象集。 JVM 有自己的方式来跟踪活动对象。
收集器将跟踪活动集,标记所有活动对象。
然后收集器将根据类型移动活动对象设置到另一个内存区域(复制收集器)或遍历堆,在发现死对象时删除它们,并可选择压缩堆。
在您的特定情况下,匿名对象没有特定引用这一事实对 gc 来说并不重要,因为它有自己的方式来跟踪活动对象和死对象。