Environment.WorkingSet 错误地报告在 Windows 2003 Server 上运行的网站的内存使用情况。(操作系统版本:Microsoft Windows NT 5.2.3790 Service Pack 2,.NET 版本:2.0.50727.3607)
它将内存报告为工作集(物理内存):1952 MB (2047468061)。
同一网站在 Windows Vista 上本地运行,工作集(物理内存):49 MB (51924992)。
我对服务器的访问权限有限,支持也非常有限:(。
所以我通过使用 VirtualQuery 遍历来计算总内存。
状态为 MEM_FREE 的页面总数为 1300 MB。
(我猜服务器有 4 GB RAM 并且 PAE 未启用,最大用户模式虚拟地址是 0x7fff0000。)
所以,我知道工作集不仅仅与虚拟内存有关。但是,拥有如此高的工作集而在另一台机器上却很低,这正常吗?
我认为问题与中描述的内容有关本文 http://www.chrisbrandsma.com/2005/05/fun-with-workingset-and-int32.html:
2005 年 5 月 4 日
工作集和 int32 的乐趣
我终于在 .NET 框架中发现了一个诚实的错误。
... 这
workingSet 返回进程正在使用的内存量,如下所示
一个整数(32 位有符号整数)。好的,所以 a 的最大值
整数是 2,147,483,647——这非常接近总数
进程在其工作集中可以拥有的内存量。
... Windows 中实际上有一个开关可以允许进程使用
3 GB 内存而不是 2 GB。此开关经常在以下情况下打开
处理分析服务——这可能会占用大量内存。所以
现在发生的事情是,当我轮询工作集时,我得到了否定的结果
数,一个非常大的负数。通常,在领域
-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 http://web.archive.org/web/20070214002249/http://blogs.msdn.com/brada/archive/2003/10/16/50535.aspx关于
这个问题。我仍然不知道他们将如何解决这个问题
Win64...这个技巧将不再起作用。
http://msdn2.microsoft.com/library/0aayt1d0(en-us,vs.80).aspx http://msdn2.microsoft.com/library/0aayt1d0(en-us,vs.80).aspx:
将会有一个 Process.WorkingSet64 变量,它们是
弃用工作集。
但从另一方面来说,我认为对于一个受管理的组织来说这是不可能的。
进程接近 3GB 限制,因为运行时会分割
内存分成多个堆。这不是真的吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)