匿名对象创建和 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 实例之后;
有外层引用Frame1
class
如果一个实例在代码中不可用(可达),那么它就死了。当 gc 运行时,它识别 活动集 ,而不是死对象集。 JVM 有自己的方式来跟踪活动对象。
收集器将跟踪活动集,标记所有活动对象。
然后收集器将根据类型移动活动对象设置到另一个内存区域(复制收集器)或遍历堆,在发现死对象时删除它们,并可选择压缩堆。
在您的特定情况下,匿名对象没有特定引用这一事实对 gc 来说并不重要,因为它有自己的方式来跟踪活动对象和死对象。
匿名对象如何使用,例如 return 语句:
return new JsonObject().put("name","xyz")
分配在堆中?由于它们没有任何命名引用,垃圾收集器如何从内存中清除它们?我试图寻找答案,但找不到答案,所以张贴在这里。
这里有类似的问题;
注意这一行;
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 实例之后;
有外层引用Frame1
class
如果一个实例在代码中不可用(可达),那么它就死了。当 gc 运行时,它识别 活动集 ,而不是死对象集。 JVM 有自己的方式来跟踪活动对象。
收集器将跟踪活动集,标记所有活动对象。
然后收集器将根据类型移动活动对象设置到另一个内存区域(复制收集器)或遍历堆,在发现死对象时删除它们,并可选择压缩堆。
在您的特定情况下,匿名对象没有特定引用这一事实对 gc 来说并不重要,因为它有自己的方式来跟踪活动对象和死对象。