簡體   English   中英

匿名對象創建和GC

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM