2016-06-14 92 views
0

我知道這看起來像是重複的,但我認爲這個具體情況可能有點不同。顯式釋放內存

在我的MVC應用程序中,我有一個ViewModel包含一個大的列表,用於顯示類似於Excel表格的表格。每個MyComplexClass包含一個MyComplexClass列表和一個MyComplexColumn列表。

這使得一個相當大的內存使用情況,但現在我有一個問題。我應該寫一個清理我的大表的方法,並將一組不同的數據加載到它中。我可以寫這樣的:

MyViewModel.Lines = new List<MyComplexClass>(); 
    MyViewModel.LoadNewSetOfData(SetOfData); 

但是,從C正在添加背景,明確地失去對舊名單我引用不是我能夠做到的,並繼續在鏡子,每天早上看着我的臉。

我看到HereHereHere,我可以設置基準以零,然後調用

GC.Collect() 

但有人告訴我,我是不是真的最好的做法,特別是因爲它可能真的會影響性能,因爲我無法知道GC是否已經處理了這種特定的內存分配。

是不是有什麼辦法可以讓我打電話像Free()這樣的東西而活下去?

謝謝

+3

只要活下去,讓GC開展工作。 –

+0

*「這會造成相當大的內存使用量」* - 那麼您是否真的內存不足或只是擔心?如果第二種選擇 - 只是不認真對待,GC在大多數情況下都會很好地工作。 –

+0

是的,GC比你的工作更好,對於沒有明確釋放記憶的人來說,絕不會感到羞恥。 – Master117

回答

4

別擔心!試圖「鼓勵」垃圾收集器來回收內存不是一個好主意 - 只需要讓它在後臺完成它的工作即可。

只需加載您的不同數據集。如果內存越來越小,GC就會開始回收內存,而無需執行任何操作,並且如果有足夠的內存可用,則可以加載新的設置而不會造成垃圾回收。

+0

所以在C#中絕對沒有辦法釋放內存空間?我的意思是,除了在C中編寫dll,並在我的C#代碼中調用它? –

+0

@MarrowGnawer - 也許問題是爲什麼你擔心釋放內存這麼多? – Sean

+0

15年的C把我變成一個瘋子我猜... –

1

簡短的回答 - 不要擔心垃圾回收。我唯一擔心的是如果你把大量的對象和數據放在一個他們可能無法正確收集垃圾的地方。例如,您在ASP.NET會話中存儲了大量的每用戶數據,即使用戶訪問了幾頁並離開,它也會長時間存在。

但是隻要對對象的引用被釋放(當它們超出範圍時),垃圾回收就可以完成它的工作。它可能不完美,但它確實非常好。在大多數情況下,開發好的垃圾收集工作和思想可能超出了我們在開發應用程序本身時所做的工作。

雖然我們有能力觸發它,但是.NET框架的設計有意讓我們專注於更高層次的抽象,而不必擔心像釋放內存時那樣的小細節。