2011-09-06 125 views
4

有人可以提供.NET內存管理的非常高級的概述嗎?.NET內存管理

更具體地說我在尋找內存管理的概述..

  • 是有一個整體的.NET堆?
  • 是堆應用程序的基礎?
  • 當我運行我的應用程序是一個新的堆創建/內存分配或是從整個.net堆的內存?
  • 當.net堆耗盡其原始內存時會發生什麼?它是否從操作系統請求更多?
  • 的基礎將是一個很好的開始讓我然後去開啓和閱讀更多
+1

垃圾回收:Microsoft .NET Framework中的自動內存管理 - http://msdn.microsoft.com/en-us/magazine/bb985010.aspx –

+0

太好了 - 我會給這個讀 - 謝謝 – Developr

回答

2

每個進程都有自己的堆 - 如果GC後需要更多的內存清理了一切可能的進程要求操作系統獲取更多信息。

我知道關於這類信息的最佳資源是Jeffrey Richter的書CLR via C#

+0

所以。網本身並沒有默認或整體的內存分配?只要我的應用程序(進程)在運行時執行,並且在GC完成之後需要更多內存,則需要從操作系統請求更多內存?我是否有正確的思路,如果此時操作系統不能爲我的進程提供內存,那麼會發回內存異常(OOM)異常? – Developr

+0

@ user799372:我不相信有任何默認限制,不是(不像Java不同,比如說)。我相信一個CLR託管環境可以執行一個,如果它想的話。是的,如果沒有足夠的內存來滿足你的應用程序,你會得到一個OOM。 –

+0

我的進程創建堆,這是否有一個默認限制?或者是一旦我的流程開始並且堆已經被「調整」到我的流程需要時計算的極限值?那麼堆內的對象會根據它們的屬性和對象大小由GC進行混洗爲正確的代? – Developr

1

是否有一個整體.net堆?

還有很多。你通常關心的是第1代,第1代和第2代垃圾堆,大型對象堆和裝載堆。世代有助於使垃圾收集器更有效。 LOH用於太大而不能移動的物體。加載器堆存儲靜態變量值。

是堆應用程序的基礎?

不,它們是基於AppDomain的。 AppDomains爲流程提供了一種廉價的替代方案。

當我運行我的應用程序是一個新的堆創建/內存分配或是從整個.net堆的內存?

默認CLR在您的代碼開始運行之前創建具有關聯堆的主AppDomain。

當.net堆耗盡其原始內存時會發生什麼?它是否從操作系統請求更多?

是的。

+0

應用程序域是自動創建還是我們必須定義/構建到我們的應用程序? – Developr

+0

在第三個答案中指出:默認CLR自動創建主AppDomain。其他人將需要代碼。 –

+0

啊,你確實說過 - 對不起,我誤解了:) soo ..當創建一個進程時,主要的appdomain也是。如果我們想要更多的應用程序域,則需要代碼。我們如何知道添加後續應用程序域的過程?這只是我們應該知道的事情,例如,我們可能會使app1:process1&已經意識到它的存在,因此可以編程方式將第二,第三等appdomain添加到該特定進程? – Developr