簡體   English   中英

監控應用程序內存使用情況的正確方法是什么?

[英]What is the right way to monitor application memory usage?

出於調試目的,我編寫了這個小靜態方法:

public static long CheckMemory(long maxMemorySizeBytes)
{
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    var usedMemoryBytes = Process.GetCurrentProcess().VirtualMemorySize64;
    if (usedMemoryBytes > maxMemorySizeBytes)
        Debugger.Break();

    return usedMemoryBytes;
}

出於某種原因, VirtualMemorySize64不斷返回比Visual Studio Diagnostic Tools窗口顯示的內存更多的內存,以及任務管理器顯示的內容。 對於我現在正在運行的具體示例,以下是數字:

  • 診斷工具:~250 MB
  • 任務管理器:~120 MB
  • VirtualMemorySize64:~1100 MB

為什么會出現如此大的差異,如何從應用程序本身內正確跟蹤內存使用情況?

VirtualMemorySize測量進程使用的所有虛擬內存。 其中包括計算機上所有其他進程共享的頁面。 在.NET程序中包含操作系統,CLR,抖動和ngen-ed框架程序集。

診斷工具 - 顯示應用程序的“ 私有字節”度量標准的實時圖表。 Private Bytes是進程分配的內存總量的度量,不包括與其他進程共享的內存。

任務管理器中 ,默認情況下,您會看到“私有工作集”內存,該內存是進程使用的內存量,無法在其他進程之間共享。

所以:

如果您想了解您正在使用多少內存,請檢索進程的VirtualMemorySizeWorking SetPrivate Bytes

  • 私有字節與任務管理器誤導性地稱為“VM大小”相同。
  • 工作集是任務管理器所謂的“內存使用”,它是進程的地址空間(“專用字節”加上內存映射文件)的一部分,當前駐留在RAM中並且可以在沒有頁面錯誤的情況下被引用。
  • VirtualMemorySize是進程的總虛擬地址空間,包括專用字節和內存映射內容。

如果你將所有進程的VirtualMemorySize相加,你可能會發現它增加了比你實際擁有的內存更多的內存。 那是因為那些內存映射文件,EXE,DLL等可以在進程之間共享; RAM中的相同物理頁面可以同時在多個進程的地址空間中訪問。

暫無
暫無

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

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