2012-03-12 70 views
5

當我運行我的應用程序時,在一個探查器中,我看到使用了大約80MB的內存(總提交字節數,性能計數器)。但是當我查看分配內存的大小時,它已超過400MB!爲什麼.NET爲我的應用程序保留這麼多內存?

所以我的問題是,爲什麼.NET爲我的應用程序保留這麼多內存?這是正常的嗎?

+1

你的機器有多少內存? – 2012-03-12 15:37:46

+0

這是無關緊要的。我的客戶爲其用戶提供了最大200MB的限制。除此之外,我只想知道爲什麼.NET會這麼做,或者爲什麼它如此之多:) – Martijn 2012-03-12 15:39:28

+0

[這篇文章非常有用](http://www.itwriting.com/dotnetmem.php) – Steve 2012-03-12 15:46:35

回答

1

正如你毫無疑問知道,使用和分配的實際內存之間存在巨大差異。應用程序分配的內存並不意味着它實際上在任何地方使用;所有這一切意味着操作系統已經標記了一個虛擬內存區域(這正是虛擬內存),可供應用程序使用。

內存不一定在使用或捱餓其他進程 - 它只是可能如果應用程序開始填充它。

這個分配數量,也將根據機器的整體記憶的生態系統可能規模。如果應用程序啓動時有足夠的空間,那麼它可能會佔用較大的分配空間,而不是較少。

這個原理與創建List<T>是一個很好的實踐是一樣的,比如說,具有合理的初始容量,這意味着在調整大小需要發生之前可以添加相當數量的項目。操作系統採用與內存使用相同的方法。

+0

這的確是我已經知道的,但無論如何感謝。但我仍然很好奇爲什麼.NET保留了這麼多的內存。如果它大概在40MB左右,好吧,但我認爲320MB非常棒! – Martijn 2012-03-12 15:49:18

+3

這不僅僅是.Net,操作系統在內存預留中扮演着重要角色。基本上,windows說:「我有16GB的物理內存,我想我會爲這個過程分配1GB ...」**對於完全相同的應用程序,*不同的機器***,它可能會說「我有4GB物理RAM,我將爲這個過程分配200MB ......「這兩個都沒有提到你的應用程序,.net框架或其他任何東西。 – NotMe 2012-03-12 15:55:03

6

你應該閱讀Memory Mystery。我剛纔也有類似的問題,讀完這些後我不再問自己。 我讀了其他來源,但我現在找不到,使用關鍵字「不合理的內存窗口操作系統分配」。簡而言之,操作系統提供的應用程序數量超過了您的應用程序的要求,具體取決於物理可用內存資源 ,例如,如果你在兩臺機器上用不同的RAM運行你的應用程序,它可以保證這兩個機器都會有不同的內存分配

+1

鏈接已損壞。 – Dan 2012-12-20 14:56:19

+1

http://www.onlingguns.com/forum/threads/88-The-Memory-Mystery – 2015-06-29 01:12:20

+0

感謝Van Thoai Nguyen - 更新了現在的鏈接 – Krishna 2015-06-29 07:10:45

0

「預留」的內存絕不等同於「分配」公羊。閱讀Steve和Krishna的帖子。

你的客戶需要看的部分是私人字節。但即便如此,也不完全是一個硬數字,因爲您的應用程序的某些部分可能會交換到虛擬磁盤。你的(和你的客戶)應該忽略這一點,並讓操作系統管理分配的內容,物理內容是什麼,如果你的私人字節部分已經完全失去控制或者你有泄漏(即:未處理的非託管資源)內存和什麼交換到磁盤。

0

這是相當常見的軟件發出一個大的內存請求底層操作系統,然後在內部管理自己使用分配的內存塊的。實際上,Windows(和其他操作系統)的內存管理器實際上很常見,它明確支持這個稱爲「未提交內存」的概念,即該進程請求但尚未使用的內存。該內存真的不存在只要位佔用DRAM芯片上的空間,直到該過程實際使用它。內存的預分配實際上不需要任何費用。

應用程序出於多種原因執行此操作 - 儘管它主要是出於性能原因而完成的。具有其自己的內存使用模式知識的應用程序可以針對該模式優化其分配器;同樣,由於地址本地原因,因爲來自操作系統的連續內存請求並不總是在內存中相互「接近」,這可能會影響CPU高速緩存的性能,甚至可能會妨礙您使用某些優化。

由於上述兩個原因,.NET特別爲託管堆提前分配空間。在大多數情況下,在託管堆上分配內存僅涉及遞增堆頂指針,這是非常快的 - 而且也不可能使用標準內存分配器(其具有更通用的設計以在碎片中可接受地執行堆,而CLR的GC使用內存壓縮來急劇限制託管堆的碎片),而且如果由於在不同時間點的多個分配而導致託管堆本身在進程地址空間中被分段,則也不可能。

相關問題