2010-07-31 74 views
4

Environment.WorkingSet錯誤地報告了在Windows 2003 Server上運行的網站的內存使用情況(操作系統版本:Microsoft Windows NT 5.2.3790 Service Pack 2,.NET版本:2.0.50727.3607 )Environment.WorkingSet錯誤地報告內存使用情況

它將內存報告爲工作集(物理內存):1952 MB(2047468061)。

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

我有限的訪問服務器和支持這樣的限制:( 所以我必須通過VirtualQuery來遍歷計算的總內存的使用狀態頁面 總:。mem_free已1300 MB (我猜的服務器有。 4 GB的RAM和PAE未啓用,最大用戶模式虛擬地址爲0x7fff0000。)

所以,我知道工作集不僅僅是關於虛擬內存,但是,它是否正常具有如此高的工作集在另一臺機器上很低?

回答

1

我認爲這個問題是有關什麼是this article描述:

2005年5月4日
樂趣的工作集和INT32
我終於找到一個誠實善良錯誤的。 NET框架。

... WorkingSet返回進程正在使用的內存量爲 一個整數(32位有符號整數)。好的,所以 整數的最大值是2,147,483,647 - 這非常接近進程在其工作集中可能具有的總內存量的 。

...在Windows中實際上有一個開關,它允許進程使用3個內存而不是2個內存。處理分析服務時,此開關通常處於打開狀態 - 此事可能是內存管理員。因此, 現在發生的情況是,當我輪詢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變量,而且他們 自嘲工作集。

儘管如此,我認爲管理的 進程接近3GB限制是不可能的,因爲運行時將內存拆分爲多個堆。這是不是真的?

+2

這是一個恥辱,這個答案只是一個鏈接。鏈接現在已經死亡。 – 2015-11-08 16:16:15

1

在猜測,Environment.WorkingSet可能返回的值從GetProcessWorkingSetSize,w這基本上是用SetProcessWorkingSetSize設定的。這基本上是系統選擇的最大工作集大小,它會看到這個過程,不一定與它實際使用多少內存有關。其基本效果是,當/如果進程使用的內存多於該進程時,系統的工作集修剪器開始工作,看看它是否可以將一些內存調出到磁盤。

+0

不,它不使用GetProcessWorkingSetSize,它使用psapi.dll中的GetProcessMemoryInfo()來訪問進程內存計數器的值WorkingSetSize。 – lockedscope 2010-08-02 19:15:36