2014-09-19 50 views
0

我使用C#爲什麼create-dump-file操作會極大地增加工作集(Memory)的大小?

class Program 
{ 
    static void Main(string[] args) 
    { 
    Console.WriteLine("Hello World"); 

    Console.Read(); 
    } 
} 

寫了一個Hello世界的控制檯應用程序,當我啓動它,它採取的記憶是: enter image description here

於是,我試圖創建此進程的轉儲文件: enter image description here

創建轉儲後,這個過程花了內存: enter image description here

你可以看到工作組大小的變化,這對我來說是一個驚喜。

別的東西有趣的關於這個內存增量是:

  1. 後,我的進程的內存工作集增加到46 MB,看來它並沒有減少回7 MB了。
  2. 轉儲文件的大小不是7MB,而是46 MB。從1.83MB到2.29MB

而且,這裏

  • 私人工作集增加了我的問題:

    1.爲什麼有內存增量與創建轉儲操作相處?

    2.過去,當測試人員報告內存泄漏問題並向我發送轉儲文件時,我將轉儲文件大小視爲目標進程在實驗室環境中執行的內存大小。但從上面的簡單例子來看,似乎我總是錯了?

    3.我非常好奇46MB轉儲文件的內容(另一種說法,我對目前的hello world應用程序爲何需要46 MB內存感到好奇)。我熟悉SOS命令,比如!DumpHeap或!eeheap,但這些命令不足以告訴46MB大小文件中的所有內容。任何人都可以分享一些有用的工具,鏈接或說明?

    非常感謝您的幫助!

  • +1

    看到相關:http://stackoverflow.com/questions/1984186/what-is-private-bytes-virtual-bytes-working-set你會發現你的私人字節和提交大小沒有太大的變化,它是私人字節,你應該看看,但即使如此,它是一個更復雜,如果你讀LINKK – EdChum 2014-09-19 10:10:35

    +1

    回答你的問題,增加是由於內存轉儲生成,並將包括內存映射信息,但不嚴格使用它當前因此你的私有字節沒有增加太多,最終的轉儲文件可能是你的進程使用的總內存,但它取決於用來生成轉儲的標誌,因爲附加的處理信息和其他東西可能在轉儲中:http:// blogs。 msdn.com/b/debugger/archive/2009/12/30/what-is-a-dump-and-how-do-i-create-one.aspx – EdChum 2014-09-19 10:14:27

    回答

    3

    在95%的案例中(或者更多,我沒有關於它的統計數據),您無需擔心工作集。微軟選擇Working Set列作爲任務管理器的默認列是相當具有誤導性的。

    應用程序需要的內存稱爲虛擬內存。您可以區分三種不同類型的虛擬內存:

    1. 保留內存,在內存中也沒有對磁盤
    2. 提交的內存,這是目前沒有必要,因此寫入磁盤
    3. 提交內存既不存在於,這是當前需要的,因此可以在RAM中供CPU訪問。這被稱爲工作集。

    Windows減少或增加工作集的原因很多。在許多情況下,原因可以在你的其他應用程序中找到。然而,在你所描述的情況下,這是很明顯的:

    1. 調試器暫停過程
    2. 調試程序創建一個新線程並觸發MiniDumpWriteDump功能
    3. 這個功能需要讀取所有已提交的內存爲了將其寫入轉儲
    4. 訪問虛擬內存時,內存中已分頁到磁盤的那些部分需要分頁回RAM。
    5. 正如我們之前瞭解到,在RAM虛擬內存被稱爲工作集,所以工作集增加

    但是,它仍然取決於你與你的PC做什麼其他的事情,而創建轉儲。嘗試運行一個多線程應用程序,在轉儲過程時大量使用內存。您可能會發現,Windows會考慮這種情況,並在內存中分頁之前,會分頁顯示您自己的進程。在這種情況下,工作集不會像您的屏幕截圖中那樣增加。

    所以,再次:不要擔心工作集。 Windows只是認爲它有足夠的RAM來加速轉儲創建過程。它很可能使用了本來未使用的內存,或者減少了用於磁盤高速緩存的內存量。

    如果您想查看RAM內容,請嘗試SysInternals RAMMap。在不同情況下重複創建轉儲,例如同時複製文件或進行繁重的計算。

    相關問題