2011-08-08 37 views
2

我正在使用System.Diagnostics.Process。 PeakWorkingSet64獲取進程的當前內存使用情況。 這個過程可以達到8,10甚至12GB(不要問)。 我的問題是,當我查詢過程PeakWorkingSet64時,它工作正常,直到它停在4096mb。PeakWorkingSet64,不給我正確的結果

我的代碼是:

p.Refresh();

int m = (int)(p.PeakWorkingSet64 /(float) 1024 /(float) 1024);

任何幫助會在黑暗中appriciated

+0

我知道你說過不要問,但是12GM是什麼?你對12GM有什麼期待? –

+0

你有多少物理記憶? –

+0

24GB :)物理內存 – Noam

回答

3

射擊......

你在4GB的杏,但你有24GB物理內存。 4GB是32位進程在64位Windows操作系統上的最大用戶地址空間量。嘗試將程序明確作爲64位進程運行。我的直覺是它作爲一個32位進程運行。

VS:項目屬性 - >建設 - >目標平臺:64

更新

我的平臺設置爲64後,我的系統上下面的代碼超過4GB的工作集。由於我在6GB內存的系統上進行測試,並沒有得到太多的提示,並且內存不足以超過〜4.2GB。我確實有一臺內存爲24GB的服務器,但我不願意爲此測試軟管它! :)

我猜您的評論時,你說你在你的系統,你的程序上看到12GB內存的使用,這是總虛擬內存的使用,而不是物理內存使用。 PeakWorkingSet64指的是物理內存。

我已經把幾個小提琴在代碼,以確保生成的數據正在被觸摸,使得其保持是熱的和在物理內存中,而不是調出(不包括在工作集的數字,因爲它是在換出存儲器分頁文件,而不是實際的物理內存)。如果沒有被觸摸,Windows會積極地將內存分頁到磁盤。

 Console.WriteLine("Is64=" + (Marshal.SizeOf(IntPtr.Zero) == 8)); 

     Process p = Process.GetCurrentProcess(); 

     List<int[]> data = new List<int[]>(); 

     while (true) 
     { 
      int[] buffer = new int[1024 * 1024 * 128]; //<- 0.5GB 

      data.Add(buffer); 

      int touch = 0; 

      foreach (var b in data) 
      { 
       for (int i = 0; i < b.Length; i++) 
       { 
        touch += b[i]; 
       } 
      } 

      p.Refresh(); 

      int mb = (int)(p.PeakWorkingSet64/(float)1024/1024); 

      Console.WriteLine("ignore" + touch); 

      Console.WriteLine(mb + "MB"); 

      Thread.Sleep(1 * 1000); 
     } 

輸出:

ignore0
524MB
ignore0
1055MB
ignore0
1560MB
ignore0
2074MB
ignore0
2587MB
ignore0
3101MB
ignore0
3615MB
ignore0
4132MB
ignore0
4188MB

重要提示

請確保使用PeekWo過程rkingSet64是一個64位的進程。令我驚訝的是,即使被監控進程是64位並擁有比此更多的物理內存,試圖獲得另一個64位進程的PeekWorkingSet64的32位進程也只能獲得4096MB的最大內存使用量。

+0

+1:是的,那會也是我的猜測。然而,OP表示,該流程*可以達到8至12 GB。但如果這件事從來沒有發生過,但只是一個估計,那麼是的,那就是好的召喚。 –

+0

@Christian我假設操作系統看到8和12GB的虛擬內存,而PeakWorkingSet64返回*物理*內存。 –

+0

但對於32位進程,虛擬內存將具有相同的限制(〜4GB),不是嗎? –

0

工作組是物理內存的應用程序實際上可見量。 Windows始終在竊取所有正在運行的進程中的頁面。它會坐在他們身上一段時間,如果你嘗試訪問他們,你會讓他們回來(這被稱爲軟故障)。

如果別人需要的內存,您的網頁被寫入到交換文件,歸零,並重新使用。

因此,在您的應用程序使用的物理內存可以比工作組更大。 「窗口借用」的頁面不計算在內。

Windows有一個工作集每個進程的限制。對於32位應用程序,這是1.3GB。你可以在進程管理器中查詢這個。只是可能爲64位,這個值是4GB,我不知道。對於您描述的過程,可能需要提高此限制,以便Windows停止嘗試修剪過程內存佔用空間。

如果你想你的控逆變內存使用,你wantto看看你的過程中使用的虛擬內存總量。