2015-09-06 136 views
1

我正在使用性能敏感的WPF應用程序,並且希望每秒鐘爲我的應用程序註銷一些關鍵的內存使用情況統計信息。我的總體目標是通過確保我的應用程序在運行時不分配(很多)內存來儘可能避免垃圾回收的懲罰。如何在不分配內存的情況下測量.net應用程序的內存使用情況?

關於如何通過性能計數器或當前進程上的VirtualMemorySize64獲取此信息的信息很多。

我的問題是,VS2013探查器告訴我這些調用本身導致大量的內存分配。

剛剛獲得「Private Bytes」性能計數器的RawValue會導致在幾秒鐘內分配近3MB的數據,另有將近3MB分配給VirtualMemorySize64的調用。

是否有更高性能的方式來獲得這些數字?

+0

運行其他進程收集stat信息。 –

+1

這不是一個壞主意,但似乎重量級。你爲什麼不重新創建這個評論作爲答案,以防止它成爲最好的主意,並讓其他人評論? – dbruning

回答

-1

爲什麼難道你不使用:

My.Computer.Info.AvailablePhysicalMemory 
My.Computer.Info.AvailableVirtualMemory 
My.Computer.Info.TotalPhysicalMemory 
My.Computer.Info.TotalVirtualMemory 

這些功能不需要任何費用的內存。

我想你不需要像監視你的記憶(如私人字節,工作集等),垃圾收集可以幫助你以一種好的方式控制這種用法。

+0

我試圖監視我自己的應用程序的內存使用情況,而這些統計數據是整個計算機。 – dbruning

+0

我想你可以將它們放在LOAD事件的第一行,並保存它們以查看應用程序是如何進行的。主要的問題不是你的程序在啓動時分配的內存是多少,而是它在執行過程中分配多少內存 - 並且使用它們你的代碼/時間/執行懲罰將盡可能低。其他方法可以顯示粒度,但消耗更多的CPU和內存,有時需要管理員權限。 –

+0

這比無用的更糟糕,如果機器上發生其他事情(例如病毒掃描),它可能很容易給出錯誤結果 – dbruning

0

運行其他進程收集統計信息。

public static void CollectStatInfo(int pid) 
    { 
     var memorySize = Process.GetProcessById(pid).PrivateMemorySize64; 
    } 

    static void Main(string[] args) 
    { 
     switch (args.FirstOrDefault()) 
     { 
      case "--collect-stat-info": 
       var pid = int.Parse(args.ElementAtOrDefault(1)); 
       CollectStatInfo(pid); 
       return; 
     } 

     CollectStatInfoFromOtherProcess(); 

     //code 
    } 
    public static void CollectStatInfoFromOtherProcess() 
    { 
     Process.Start(new ProcessStartInfo() 
      { 
       Arguments = $"--collect-stat-info {Process.GetCurrentProcess().Id}", 
       FileName = Assembly.GetExecutingAssembly().Location 
      } 
     ); 
    } 
+0

這顯示瞭如何讓一個可執行文件以命令行參數自行啓動。這並沒有回答「如何剖析我的應用的內存使用情況」這個問題。 – CodeCaster

+0

@CodeCaster這是對「如何在不測量測量代碼的情況下剖析我的應用的內存使用情況」這一問題的回答。 –

+0

不,您添加了很多代碼,只是啓動當前進程的另一個實例,傳遞舊實例的PID。在編輯之前,這就是它所做的一切;現在它調用OP提到的「PrivateMemorySize64」有問題。這當然不是你想要的每一秒。 – CodeCaster