[英]Anonymous object Creation and GC
如何使用匿名對象,例如在返回語句的情況下使用:
return new JsonObject().put("name","xyz")
是否在Heap中分配? 由於它們沒有任何命名引用,垃圾收集器如何從內存中清除它們? 我試着尋找答案但找不到答案,所以在這里張貼。
如果一個實例在代碼中不可用(可達),那么它已經死了。 當gc運行時,它識別實時集 ,而不是死對象集。 JVM有自己的方式來跟蹤活動對象。
收集器將跟蹤實時集,標記所有活動對象。
然后,收集器將根據類型將實時集移動到另一個內存區域(復制收集器)或遍歷堆,在找到它們時刪除死對象並可選地壓縮堆。
在您的特定情況下,匿名對象沒有特定引用的事實對gc並不重要,因為它有跟蹤實時和死對象的方式。
這里也有類似的問題; Inner Class有一個對外部類的隱式引用,可能會泄漏內存 ,這里有一個很好的描述http://viralpatel.net/blogs/inner-classes-in-java/
注意這條線;
內部類的對象具有對實例化它的外部類對象的隱式引用。
你可以在一個簡單的測試中看到這個;
public class Frame1
{
public class JsonObject
{
int field1 = 123;
int field2 = 456;
public JsonObject() { }
}
// code that callSomething()
// ...
private Object callSomething()
{
return new JsonObject();
}
}
我在返回行上添加了一個斷點,並允許代碼步進足夠遠以便創建JsonObject。 然后在附加JVisualVM並查看我看到的堆上唯一的JsonObject實例之后;
有一個外部Frame1
類的引用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.