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。)
所以,我知道工作集不仅仅是关于虚拟内存。但是,在另一台机器上使用如此高的工作组而非常低,这是正常的吗?
答案 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:
但是,在切线方面,我认为管理层是不可能的 进程接近3gb限制,因为运行时拆分了 记忆成多个堆。这不是真的吗?
会有一个Process.WorkingSet64变量,它们就是 弃用WorkingSet。