[英]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窗口顯示的內存更多的內存,以及任務管理器顯示的內容。 對於我現在正在運行的具體示例,以下是數字:
為什么會出現如此大的差異,如何從應用程序本身內正確跟蹤內存使用情況?
VirtualMemorySize測量進程使用的所有虛擬內存。 其中包括計算機上所有其他進程共享的頁面。 在.NET程序中包含操作系統,CLR,抖動和ngen-ed框架程序集。
診斷工具 - 顯示應用程序的“ 私有字節”度量標准的實時圖表。 Private Bytes是進程分配的內存總量的度量,不包括與其他進程共享的內存。
在任務管理器中 ,默認情況下,您會看到“私有工作集”內存,該內存是進程使用的內存量,無法在其他進程之間共享。
所以:
如果您想了解您正在使用多少內存,請檢索進程的VirtualMemorySize , Working Set和Private Bytes 。
如果你將所有進程的VirtualMemorySize相加,你可能會發現它增加了比你實際擁有的內存更多的內存。 那是因為那些內存映射文件,EXE,DLL等可以在進程之間共享; RAM中的相同物理頁面可以同時在多個進程的地址空間中訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.