簡體   English   中英

關於內存大小,清理對象

[英]Regarding memory size, cleaning up objects

考慮如下示例

class B
{
   int x;
}

class A
{
     int a;
     int b;
     B b1 = new B();

     void testMethod()
     {
        for (int i = 1; i < 10; i++)
            b1 = new B();
     }
}

class MainClass //Will never close this application
{
    static void Main(object[] args)
    {
        A a1 = new A();
        a1.testMethod();
    }
}

在上面的示例中,每次在循環中都創建一個新的B類對象。 因此,這里的問題是,當我將新對象分配給b1時,將清除前一個對象或保留它的內存。

如果沒有清理並增加內存,該如何清理?

每次創建B的新對象

b1 = new B();

存儲在b1的原始對象變得不可訪問。 這意味着它有資格進行垃圾回收。 並不意味着它會從內存雖然立即清理!

符合GC條件的對象實際上將在“將來的某個時候”進行GC處理。 我們不知道,也不需要知道確切的時間。 只要相信GC。

換句話說,在運行testMethodB 9個對象將有資格使用GC或已被收集,而第十個對象將保留存儲在變量b1

每次您這樣做: b1= new B(); ,您正在向b1分配對新對象的新引用( b1 不是 ValueType ),因此,先前的引用現在未使用,因此,垃圾回收器將對其進行處理。

總結:沒有增加內存,因為它是托管資源

任何值類型和引用類型的壽命取決於用於定義它的訪問說明符和該功能的范圍。 功能可以是定義對象的任何類,函數或循環。

在您的情況下,您定義的引用類型B b1 = new B()沒有任何訪問說明符(默認訪問說明符),因此將其視為internal 內部定義的變量不能被外界訪問。

b1范圍僅限於您定義代碼的for循環。

for (int i = 1; i < 10; i++)
            b1 = new B();

如果您注意到以上兩個條件,則將理解在每次for循環迭代之后, 垃圾回收器都會處理對象b1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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