簡體   English   中英

識別C#應用程序使用的本機內存的所有者

[英]Identify owner of native memory used by C# application

我正在開發一個C#應用程序,它可以一直在系統托盤中運行。 因此,我希望最小化應用程序在空閑時使用的內存量。 使用Windows perfmon和Windows任務管理器我得到了一些空閑內存使用數據。

  • Windows XP TaskManager - 內存使用 - 96,300K
  • 性能監視器
    • .NET CLR內存
      • 所有堆中的字節數 - 34,513,708
      • #Total committed Bytes - 40,591,360
      • #Total保留字節數 - 50,319,360

我認為這些數字意味着我的應用程序已經被Windows分配了96MB的內存。 其中50MB已分配給CLR。 CLR分發了40mb。

有沒有辦法弄清楚尚未分配給CLR的其他46mb內存用於什么? 我假設這將是用於將DLL加載到進程中的內存和此本機代碼使用的內存的組合。

編輯:我已下載VMMap並找到以下內容。

  • 私人的
    • 總計 - 72mb
    • 管理堆 - 25mb
    • 堆棧 - 16mb(看起來很大)
    • 私人數據 - 13mb(不知道這是什么)
    • 圖像 - 8mb(主要是.NET DLL)
    • 頁表 - 6mb(看起來很大)
    • 堆 - 3mb

任何人都可以建議對Stack,Private Data和Page Table數字進行解釋嗎?

注意:我最初引用的計數器現在顯示了一些奇怪的數字。

  • Windows XP TaskManager - 內存使用 - 43,428K
  • 性能監視器
    • .NET CLR內存
      • 所有堆中的字節數 - 20mb
      • #Total committed Bytes - 23mb
      • #Total保留字節數 - 50mb

這表明CLR保留的內存比分配給進程的內存多。 顯然這不可能是真的,所以TaskManager必須只顯示當前被分頁的內容。

請注意,總內存使用量之間的差異(我不完全確定TaskManager顯示的數字; Windows工具有關於使用不同術語來表示相同概念的錯誤歷史記錄)和“#Total reserved bytes”也可能被CLR使用,只是不是由托管堆(所以CLR的原生分配,加載的DLL等也可能在這里帳戶)。

您可能需要簽出Sysinternals VMMap以獲取更詳細的信息。

暫無
暫無

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

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