PeakWorkingSet64,没有给我正确的结果

时间:2011-08-08 08:16:38

标签: .net memory

我正在使用System.Diagnostics.Process。 PeakWorkingSet64获取进程的当前内存使用情况。 这个过程可以达到8,10甚至12GB(不要问)。 我的问题是,当我查询进程PeakWorkingSet64时,它工作正常,直到它停留在4096mb。

我的代码是:

p.Refresh();

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

任何帮助都是适当的

2 个答案:

答案 0 :(得分:3)

在黑暗中拍摄......

你的最大容量是4GB,但你有24GB的物理内存。 4GB是32位进程在64位Windows操作系统上拥有的最大用户地址空间。尝试明确地将程序作为64位进程运行。我的预感是它以32位进程运行。

  

VS:项目属性 - >构建 - >平台目标:x64

<强>更新

将我的平台设置为x64后,我系统上的以下代码超过了4GB的工作集。当我在具有6GB内存的系统上进行测试时,它没有得到更多,并且没有足够的内存超过~4.2GB。我确实有一台24GB内存的服务器,但我不愿意为这个测试加密! :)

当你说你的程序在你的系统上看到12GB ram使用时,我猜你的评论,这是虚拟内存的总使用量,而不是物理内存< / em>用法。 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

重要提示

确保使用PeekWorkingSet64的进程是64位进程。令我惊讶的是,尝试获取另一个64位进程的PeekWorkingSet64的32位进程将获得仅4096MB的最大内存使用量,即使受监视的进程是64位并且拥有更多的物理内存。

答案 1 :(得分:0)

工作集是应用程序实际可见的物理内存量。 Windows一直在窃取所有正在运行的进程中的页面。它会坐在它们上一段时间,如果你试图访问它们,你会把它们取回(这称为软故障)。

如果其他人需要内存,您的页面将被写入交换文件,归零并重复使用。

因此,应用程序使用的物理内存可能比工作集大。窗口“借用”的页面不计算在内。

Windows对工作集具有每个进程限制。对于32位应用程序,这是1.3gb。您可以在进程资源管理器中进行查询。也许对于64位这个值是4gb,我不知道。对于您描述的过程,提高此限制可能是值得的,因此Windows会停止尝试修剪您的进程内存占用。

如果要控制内存使用,则需要查看进程使用的总虚拟内存。