代码之家  ›  专栏  ›  技术社区  ›  lockedscope L42

Environment.WorkingSet错误地报告内存使用情况

  •  4
  • lockedscope L42  · 技术社区  · 14 年前

    Environment.WorkingSet错误地报告了在Windows 2003 Server上运行的网站的内存使用情况。(操作系统版本:Microsoft Windows NT 5.2.3790 Service Pack 2,.NET版本:2.0.50727.3607)

    它将内存报告为工作集(物理内存):1952 MB(2047468061)。

    我对服务器的访问权限有限,支持也非常有限:(。 所以我用VirtualQuery遍历计算了总内存。 状态为:MEM\u FREE的页面总数为1300 MB。 (我猜服务器有4gbs的RAM,PAE没有启用,最大用户模式虚拟地址是0x7fff0000。)

    所以,我知道工作集不仅仅是关于虚拟内存。但是,在另一台机器上有这么高的工作台而工作台却很低,这正常吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Michel de Ruiter    9 年前

    我认为这个问题与中所描述的有关 this article :


    有趣的工作集和int32
    我终于在.NET框架中发现了一个诚实的bug。

    ... 这个 整数(32位有符号整数)。好的,那么 整数是2147483647——非常接近总数 进程在其工作集中可以拥有的内存量。

    与分析服务打交道——这东西可能会占用内存。所以呢 现在发生的事情是,当我投票的工作集,我得到一个负 数字,一个非常大的负数。通常,在

    ... 问题是溢位。

    整数的第一位是符号位。0为正,1为负。 所以,当值从(二进制)变为 100000000000000000000000值从2147483647到 -2147483647.

    好吧,所以我还是要解决这个问题。以下是我的想法(用C#):

    long lWorkingSet = 0;
    if (process.WorkingSet >= 0)
     lWorkingSet = processWorkingSet;
    else
     lWorkingSet = ((long)int.MaxValue*2)+process.WorkingSet;
    

    希望这能暂时解决问题。

    knows 这个问题。我还得弄清楚他们要怎么解决这个问题 Win64…此技巧将不再有效。


    http://msdn2.microsoft.com/library/0aayt1d0(en-us,vs.80).aspx
    会有一个Process.WorkingSet64变量,它们是

    不过,从正切的角度来说,我认为这是不可能的 进程接近3gb限制,因为运行时将

        2
  •  0
  •   Jerry Coffin    14 年前

    猜猜看, Environment.WorkingSet 可能是从 GetProcessWorkingSetSize ,这基本上就是我们设定的 SetProcessWorkingSetSize . 它基本上是系统选择的最大工作集大小 要了解这个过程,不一定与它实际使用了多少内存有关。基本效果是,当/如果进程使用的内存超过这个值,系统的工作集微调器就会开始工作,看它是否可以将部分内存分页到磁盘。