2011-08-08 40 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看看你的过程中使用的虚拟内存总量。