none
Process类中WorkingSet64的问题 RRS feed

  • 问题

  • 我使用Process类中WorkingSet64属性来获得系统中某个启动程序的内存的时候 发现这个获取的值 和系统资源管理器中的不一样

    我的意思是 我开了个CMD窗口 在系统资源管理器中显示 占用520K

    但是我用WorkingSet64属性去显示这个CMD窗口的内存时却显示个 2172K(我除了个1024取整)

    为什么会大这么多?

    是这个属性显示不准确还是系统的资源管理器显示不准确?

    测试其他程序的时候也是如此 值会大于系统资源管理器中显示的值。。

    还望指教。。谢谢
    2009年10月22日 4:05

答案

  • http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.privatememorysize64(VS.80).aspx


    这个属性请参考这里

    你的应该是vista的操作系统,我的是xp的

    下面是vista和xp中任务管理器的对应关系

    内存 - 工作集:进程正在使用的物理内存总和 = (专用工作集 + 可以由其它进程共享的内存)
    内存 - 高峰工作集:进程所使用的工作集内存的最大数量
    内存 - 工作集增量:进程所使用的工作集内存中的更改量
    内存 - 专用工作集:进程独占的物理内集
    内存 - 提交大小:进程为用户保留的虚拟内存数量
    内存 - 页面缓冲池:可以写入其他存储媒体(例如硬盘)的某个进程的认.........

    我对Vista系统不是很熟悉,期待其他朋友为你提供更详尽的解释
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://blog.tanging.net
    • 已标记为答案 magic_os 2009年10月23日 12:29
    2009年10月22日 8:23
    版主

全部回复

  • 占用的物理内存是实时变化的 但是大体一致的

    class ProcessMonitorSample
          {
             public static void Main()
             {

                // Define variables to track the peak
                // memory usage of the process.
                long peakPagedMem = 0,
                    peakWorkingSet = 0,
                    peakVirtualMem = 0;

                Process myProcess = null;

                try
                {
                   // Start the process.
                   myProcess = Process.Start("NotePad.exe");

                   // Display the process statistics until
                   // the user closes the program.
                   do
                   {
                      if (!myProcess.HasExited)
                      {
                         // Refresh the current process property values.
                         myProcess.Refresh();

                         Console.WriteLine();

                         // Display current process statistics.

                         Console.WriteLine("{0} -", myProcess.ToString());
                         Console.WriteLine("-------------------------------------");

                         Console.WriteLine("  physical memory usage: {0}",
                             myProcess.WorkingSet64/1024);
                         Console.WriteLine("  base priority: {0}",
                             myProcess.BasePriority);
                         Console.WriteLine("  priority class: {0}",
                             myProcess.PriorityClass);
                         Console.WriteLine("  user processor time: {0}",
                             myProcess.UserProcessorTime);
                         Console.WriteLine("  privileged processor time: {0}",
                             myProcess.PrivilegedProcessorTime);
                         Console.WriteLine("  total processor time: {0}",
                             myProcess.TotalProcessorTime);

                         // Update the values for the overall peak memory statistics.
                         peakPagedMem = myProcess.PeakPagedMemorySize64;
                         peakVirtualMem = myProcess.PeakVirtualMemorySize64;
                         peakWorkingSet = myProcess.PeakWorkingSet64;

                         if (myProcess.Responding)
                         {
                            Console.WriteLine("Status = Running");
                         }
                         else
                         {
                            Console.WriteLine("Status = Not Responding");
                         }
                      }
                   }
                   while (!myProcess.WaitForExit(1000));


                   Console.WriteLine();
                   Console.WriteLine("Process exit code: {0}",
                       myProcess.ExitCode);

                   // Display peak memory statistics for the process.
                   Console.WriteLine("Peak physical memory usage of the process: {0}",
                       peakWorkingSet/1024);
                   Console.WriteLine("Peak paged memory usage of the process: {0}",
                       peakPagedMem/1024);
                   Console.WriteLine("Peak virtual memory usage of the process: {0}",
                       peakVirtualMem/1024);

                }
                finally
                {
                   if (myProcess != null)
                   {
                      myProcess.Close();
                   }
                }

                Console.ReadKey();
             }

          }


    这段代码打开记事本后的内存基本是在4724左右 而任务管理中NotePad.exe这个进程也是这个大小

    所以应该是没有问题的


    运行结果


    System.Diagnostics.Process (notepad) -
    -------------------------------------
      physical memory usage: 92
      base priority: 8
      priority class: Normal
      user processor time: 00:00:00
      privileged processor time: 00:00:00
      total processor time: 00:00:00
    Status = Running

     

    System.Diagnostics.Process (notepad) -
    -------------------------------------
      physical memory usage: 4744
      base priority: 8
      priority class: Normal
      user processor time: 00:00:00.0156250
      privileged processor time: 00:00:00.0312500
      total processor time: 00:00:00.0468750
    Status = Running

     

    System.Diagnostics.Process (notepad) -
    -------------------------------------
      physical memory usage: 4744
      base priority: 8
      priority class: Normal
      user processor time: 00:00:00.0156250
      privileged processor time: 00:00:00.0312500
      total processor time: 00:00:00.0468750
    Status = Running

     

    Process exit code: 0
    Peak physical memory usage of the process: 4764
    Peak paged memory usage of the process: 2288
    Peak virtual memory usage of the process: 38612


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://blog.tanging.net

    • 已标记为答案 magic_os 2009年10月22日 6:17
    • 取消答案标记 magic_os 2009年10月22日 7:13
    2009年10月22日 4:59
    版主
  • -  -首先谢谢上面这位版主打了这么多。。。

    但是俺的问题是。。就是不一致。。因为我发现那个属性返回的结果和我在任务管理器看到的相差太远,有的是4倍 或者 5倍。。才有此一问
    2009年10月22日 6:13
  • 。。。仔细一看上面代码 发现问题了

    。。。俺用的是WorkingSet64这个是 获取为关联的进程分配的物理内存量。

    PeakWorkingSet64才是 获取关联的进程使用的最大物理内存量。

    -----------

    难怪会大那么多 -  -

    呵呵 谢谢上面这位版主
    • 已标记为答案 magic_os 2009年10月22日 6:17
    • 取消答案标记 magic_os 2009年10月22日 7:13
    2009年10月22日 6:17
  • 呵呵 不客气~~~


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://blog.tanging.net
    2009年10月22日 7:10
    版主
  • 刚才我测试了一下关于 process类的一些方法属性。。这个问题还是有点疑问

    我在win7下测试记事本程序占用内存情况的时候发现:
    Process.WorkingSet64 属性 它对应了 进程管理器中的 工作设置(内存)
    Process.PeakWorkingSet64 属性 对应了 峰值工作设置(内存)

    Process.PrivateMemorySize64 属性 问题就在这了 按道理来说他应该对应那个  内存(专用工作集)
    但是我查看进程管理器时却发现PrivateMemorySize64 属性对应的是 进程管理器中的 “提交大小” 这一项 这是为何? 那什么属性是对应 “专用工作集”的?

    ---------------

    另外 我想知道 内存的峰值工作设置是在什么情况下才会改变?变大或者变小

    以及 内存的 提交大小 是个什么概念? 
    2009年10月22日 7:22
  • http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.privatememorysize64(VS.80).aspx


    这个属性请参考这里

    你的应该是vista的操作系统,我的是xp的

    下面是vista和xp中任务管理器的对应关系

    内存 - 工作集:进程正在使用的物理内存总和 = (专用工作集 + 可以由其它进程共享的内存)
    内存 - 高峰工作集:进程所使用的工作集内存的最大数量
    内存 - 工作集增量:进程所使用的工作集内存中的更改量
    内存 - 专用工作集:进程独占的物理内集
    内存 - 提交大小:进程为用户保留的虚拟内存数量
    内存 - 页面缓冲池:可以写入其他存储媒体(例如硬盘)的某个进程的认.........

    我对Vista系统不是很熟悉,期待其他朋友为你提供更详尽的解释
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://blog.tanging.net
    • 已标记为答案 magic_os 2009年10月23日 12:29
    2009年10月22日 8:23
    版主
  • 我是在WINDOWS 7 里面装了个VS ~

    在测试这个process类的时候发现 原本按照道理来说 Process.PrivateMemorySize64 属性 应该对应任务管理器中的  “内存(专用工作集)”

    但是它返回的大小却是 任务管理器中的 “提交大小” 那一项的值。。这个不知道是怎么了
    2009年10月22日 11:57