2012-05-17 55 views
0

在運行時我發現,有我的應用有非常大的內存使用情況..減少內存泄漏的最佳方法是什麼?

但似乎我只用3〜4 MemoryStream S的之一有時是滿81 MB的..

其餘主要爲20 MB,3 MB和1MB容器......

但仍然有應用程序525.xx MB的內存使用...

我使用using(...)語句,但也沒有任何的運氣嘗試。 。

所以,我在這裏問最有效的方法來減少內存泄漏。

+2

人們可能需要更多的信息來弄清楚(代碼等)。使用分配概要分析器等工具查看內存中的哪些對象:http://dotnet.dzone。com/articles/pinpointing-memory-leaks-clr – bryanmac

+2

我想說你可能想完全擺脫內存泄漏。這應該有助於減少很多。 – Tom

+0

沒有任何具體的信息,這可能會有所幫助:http://stackoverflow.com/questions/620733/memory-leak-in-c-sharp –

回答

1

在受管理的.NET應用程序中,除非您正在分配非託管資源句柄並且未正確處理它們,否則通常不會在原始意義上具有內存「泄漏」。但這聽起來不像你在做什麼。

更有可能的是,您持續引用您不再需要的對象,這會使內存「活着」超出您的預期。例如,如果您將5MB數據放入內存流中,然後將該內存流分配給靜態字段,那麼在應用程序的整個生命週期中,5MB永遠不會消失。當不再需要指向內存流的靜態字段時,需要將空值賦給靜態字段,以便垃圾回收器將釋放並回收該5MB內存。

同樣,直到函數退出時纔會釋放局部變量。如果您分配了大量內存並將其分配給本地變量,然後調用運行數小時的另一個函數,則本地變量將始終保持活動狀態。如果您不再需要該內存,則將null分配給本地變量。

你如何確定你的應用程序有內存泄漏?如果您正在查看由任務管理器顯示的進程虛擬內存分配,這不是很準確。應用程序的內存管理器可能會從操作系統分配大量內存,並在內部釋放它們以用於應用程序內的其他用途,而不會將它們釋放回操作系統。

使用常識的做法。調用處理或關閉,並在您不再需要它們的內容時立即將變量賦值給變量。

僅僅因爲垃圾收集環境會讓你懶惰並不意味着你不應該在代碼中注意內存分配和釋放模式。

0

你的內存泄漏的定義似乎是不尋常的...下面的代碼將完全按照您所觀察的效果,但它很少被稱爲內存泄漏:

var data = new byte[512*1024*1024]; 
data = null; 

但你實際上可能有合法的泄漏。內存分析器將很容易地顯示它們,但可以通過代碼審查來追蹤巨大的分析器。如果你已經知道你有少量的內存流 - 檢查你是否通過存儲在某個列表或簡單的成員變量中來保持它們不活動。同樣請檢查您的大型陣列是否由於類似的原因而不能繼續運行。

相關問題