2012-10-30 61 views
2

我在.NET中閱讀了關於CLR的內容:CLR中的託管堆

當CLR加載堆在SOH和LOH中進行分區時。

  1. 當應用程序在那時啓動時,堆由CLR根據其大小分配給應用程序。

  2. LOH堆具有Gen0,Gen1和Gen2區域。

這裏是一個類的所有對象都在GEN0分配,

問題

  1. CLR如何知道大小由應用程序在堆佔用?
  2. 假設有CLR爲Gen0區域分配的4K堆內存。鑑於下面的代碼,這個單線程可能在Gen0上使用全4K內存嗎?

    collect = new List(); 
    while(true) 
    { 
        collect.Add(new A()); 
        new A(); 
        new A(); 
    } 
    
    class A 
    { 
        int a = 0, b = 0; 
    } 
    
+0

1.我相信這是通過計算尺寸的所有聲明的字段肯定考慮其類型 – sll

+0

做到這一點是這是在有關的第二個問題application.What開始分配上堆所需的內存呢? – yuthub

+0

我認爲CLR會從程序集的元數據看它能否計算所需的堆。我正確嗎? – yuthub

回答

1
  1. 我相信這是通過計算大小的所有聲明的字段的必然考慮其類型來完成。欲瞭解更多detaikls請參閱MSDN "Allocating Memory"
  2. 關於MSDN紙"Automatic Memory Management"所有新對象(如Brian Rasmussen在下面的評論指出的那樣 - 代適用於SOH而已,蕙創建大對象是不是代healp)在Gen0最初創建和只有那些倖存而應用程序的生命將移至Gen1。但有人提到,如果Gen0已滿--GC會執行垃圾收集來清理Gen0,如果它仍然已滿 - 將在Gen1中創建所有新對象。
+0

感謝,我讀鏈接。它清楚了很多,但一個問題。在while循環中,我們分配堆上的對象,所以CLR如何先進先出多少對象,而循環將創建。 – yuthub

+0

CLR是否可以動態增加應用程序分配堆的大小。 – yuthub

+0

獲得15聲望後,我將投票回答你的答案 – yuthub