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

时间:2010-07-31 16:12:11

标签: asp.net memory-management

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

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

在Windows Vista上使用工作集(物理内存)本地运行相同的网站:49 MB(51924992)。

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

所以,我知道工作集不仅仅是关于虚拟内存。但是,在另一台机器上使用如此高的工作组而非常低,这是正常的吗?

2 个答案:

答案 0 :(得分:1)

猜测,Environment.WorkingSet可能会返回GetProcessWorkingSetSize的值,这基本上是SetProcessWorkingSetSize设置的值。它基本上是系统选择的最大工作集大小,它喜欢来看这个过程,不一定与它实际使用多少内存有关。基本的效果是,当进程使用的内存多于内存时,系统的工作集修剪器会工作,看它是否可以将其部分内存分页到磁盘。

答案 1 :(得分:1)

我认为问题与this article中描述的内容有关:

  

2005年5月4日
  使用WorkingSet和int32 的乐趣   我终于在.NET框架中发现了一个诚实的善良错误。

     

......   WorkingSet返回进程使用的内存量   整数(32位有符号整数)。好的,所以最大值   整数是2,147,483,647 - 非常接近总数   进程在其工作集中可以拥有的内存量。

     

... Windows中实际上有一个允许进程使用的开关   3演出内存而不是2演出。此开关通常在打开时打开   处理Analysis Services - 这个东西可能是一个记忆生长。所以   现在发生的事情是,当我调查WorkingSet时,我得到一个否定的   数字,一个非常大的负数。通常,在这个领域   -2,147,482,342。

     

......问题是溢出位。

     

工作集作为二进制值返回到.NET框架。该   整数的第一位是符号位。 0为正,1为负。   那么,当值变为(二进制)时   1111111111111111111111111111111到(二进制)   10000000000000000000000000000000的值从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变量,它们就是   弃用WorkingSet。

     但是,在切线方面,我认为管理层是不可能的   进程接近3gb限制,因为运行时拆分了   记忆成多个堆。这不是真的吗?