2012-01-25 113 views
4

我很開心創建我自己的壁紙更換器程序。我知道互聯網上有很多,但我只是想學習新東西。所以,直到現在,每次我創建任何簡單的程序時,我都不在乎RAM/Memory,因爲我主要爲學校創建程序,這就像是一次性使用程序,然後我忘了它。釋放內存變量

但現在我正在嘗試創建應用程序,我想使用,我的東西。我注意到我的程序在「alt + ctrl + del」窗口中需要約4000k,當它改變壁紙時有時高達20萬k,有時會下降,有時會保持這個高度,直到它改變到另一個。 Memorytaken

所以在這裏談到的問題,有什麼祕訣,讓我的應用程序使用盡可能少的RAM,同時運行(任務欄圖標,主窗口是使用if (FormWindowState.Minimized == WindowState) Hide();隱藏)

正在採取任何內存在函數內部變量?示例

int function(int a){ 
int b = 0; 
int c = a+b; 
return c; 
} 

或者這些變量在函數返回某個值後發佈嗎?

我可以使用一些提示,指南,和/或文章的鏈接,我可以得到一些有關信息。新手友好壽。

編輯: 好吧,我已經讀了一些,開始處理位圖,擺脫了我使用的全局變量之一..現在它穩定在4000-7000k。在更換壁紙時稍微提高一點,然後再降低一點。所以我想這對我來說是成功的。還有一件事還剩下。我下載了一個大/大/有很多選項的程序,這改變了壁紙,並且獲得了比我更多的選項,而且它仍然需要大約1000-2000k,所以ima現在閱讀什麼可以採取如此「多」ram在我的。正確的時候,我運行我的程序約4100,所以我想我仍然可以做一些優化。謝謝大家的答案! :)

+2

當方法返回時解壓堆棧時,堆棧上局部變量的內存空間將被回收,此時堆上局部變量的引用將有資格進行垃圾回收。我將谷歌「C#垃圾收集管理」作爲一個起點。 – BrokenGlass

+0

僅供參考,請不要在「Visual Studio C#」之類的東西前加上標題。這就是標籤的用途。 –

+0

達:羅傑那。對不起,不會再這樣做。 BrokenGlass:謝謝,當然會閱讀一些關於 – Kedor

回答

4

如果您願意,程序視角中的內存會被分成兩個塊。堆棧和堆。

堆棧表示當前的執行框架(例如當前正在執行的函數),它用於傳遞函數參數,返回值並且是通常存儲局部變量的地方。噹噹前執行框架結束時(例如,您的函數退出),該內存將被清除。

堆表示一個內存池,可以在其中創建和存儲更長時間的對象。一般來說,使用「new」操作符創建的任何內容都將放在Heap上,並且Stack上的引用(用於本地上下文)。如果對分配對象的引用停止使用,則該內存將保留,直到垃圾收集器將來某個未指定的時間運行並釋放內存爲止。當GC運行不能得到保證時 - 可能是程序內存不足或按照預定的時間間隔等。

我認爲在您觀察的內存行爲中,峯值是由於打開和加載資源,低谷在GC運行之後。觀察這種情況的另一種方式是在屏幕上顯示UI時以及程序最小化時查看程序的內存佔用情況。當最小化時,內存佔用將縮小,因爲所有的圖形元素不再是必需的。當您最大化UI並重新繪製它時,內存使用高峯。

你可以看一下以便更好地理解棧和堆的下面的文章:

C# Stack and Heap

What are stack and heap?

您可能還需要尋找到垃圾收集:

Garbage collection article on MSDN

...和Value vs Reference types

1

爲本地聲明的變量採取的內存將被自動釋放。

對於在函數外部持續存在的變量所採用的內存,當它們不再使用時,會被釋放,被稱爲GarbageCollector(簡稱GC)。

所以,不要擔心,你不用你的示例函數創建內存泄漏。

很難告訴你哪裏可以用完200,000升。有探險家可以幫助(我沒有推薦,但這是第一個在谷歌:http://memprofiler.com/

+0

的確,示例函數可能被抖動優化掉了。 – phoog