2013-12-12 14 views
0

我想寫一個簡單的C#程序/控制檯應用程序來創建緩慢和受控制的內存泄漏。我想讓程序慢慢吃掉系統內存。我需要這個來測試我正在測試的其他東西。用於創建內存泄漏的C#代碼。

有人建議我使用:

Marshal.AllocHGlobal(numbytes) 

連接到一個計時器。

這裏是我試圖執行代碼:

class Program 
{ 
    static Timer timer = new Timer(); 

    static void Main(string[] args) 
    { 
     timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 

     start_timer(); 
     Console.Read(); 
    } 

    static void timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     IntPtr hglobal = Marshal.AllocHGlobal(100); 
     Marshal.FreeHGlobal(hglobal); 

     Process proc = Process.GetCurrentProcess(); 
     Console.WriteLine(proc.PrivateMemorySize64); 
    } 

    private static void start_timer() 
    { 
     timer.Start(); 
    } 
} 

輸出似乎表明,內存仍然被管理,垃圾回收做的工作。有人可以幫我解決這個問題嗎?我的目標是確實造成內存泄漏並耗盡系統資源。有人請提出我的代碼有什麼問題,或者有其他更好的選擇。

+6

當你說「內存泄漏」,你只是指內存分配,GC不會釋放?爲什麼不把數據推入參考列表? – Jacob

+0

創建一個執行一些計算的無限循環。 – Mukus

+0

不會調用'Marshal.FreeHGlobal'釋放剛分配的內存嗎? – matthewrdev

回答

3

對於泄漏,您需要實際泄漏內存。現在,你不會泄漏任何東西,因爲你釋放它:

IntPtr hglobal = Marshal.AllocHGlobal(100); 
    // DO NOT DO THIS IF YOU WANT A LEAK: Marshal.FreeHGlobal(hglobal); 
+0

所以我評論說'Marshal.FreeHGlobal(hglobal);'並且仍然沒有泄漏。輸出結果顯示,當proc.PrivateMemorySize64的值高達22585344時,它會回落到一個較低的數字,然後回到22585344.這隻會繼續。另外,任務管理器顯示系統內存使用量沒有增加。我在這裏錯過了什麼嗎? – Zolt

+0

@Zolt是22585344進程虛擬地址空間的大小? – evanmcdonnal