一個空白WinForm在工作管理員中都佔用幾十兆記憶體,的確有點可怕!通常有3種方法:
1. 不要管他。
CLR & GC 會自動管理記憶體佔用,根據當前環境參數自動調整,這樣會得到一個最佳化的運行效率。
2. 設定託管程式進程允許的最大工作集大小。
1 Process.GetCurrentProcess().MaxWorkingSet = (IntPtr)(1024 * 1024 * 5
1 Process.GetCurrentProcess().MaxWorkingSet = (IntPtr)(1024 * 1024 * 5);
3. 使用SetProcessWorkingSetSize,將部分實體記憶體佔用轉移到虛擬記憶體。
1 [DllImport("kernel32.dll")]
2 public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max );
3
4 private void button1_Click(object sender, System.EventArgs e)
5 {
6 SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
7
1 [DllImport("kernel32.dll")]
2 public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max );
3
4 private void button1_Click(object sender, System.EventArgs e)
5 {
6 SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
7 }
注意第2,3種方法在某種程度上都會影響程式的效能。設定一個合理的工作集大小,或者在程式啟動後,空閑時(Application.Idle)使用SetProcessWorkingSetSize,還是可以的,畢竟減少記憶體佔用對於系統運行也有一定的益處。
使用案例:
1 private void timer1_Tick(object sender, System.EventArgs e)
2 {
3 // 使用定時器將當前實體記憶體佔用(MB)添加到列表框中。
4 string s = string.Format("{0}", Process.GetCurrentProcess().WorkingSet / 1024 / 1024);
5 this.listBox1.Items.Insert(0, s);
6 }
7
8 [DllImport("kernel32.dll")]
9 public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max );
10
11 private void button1_Click(object sender, System.EventArgs e)
12 {
13 // 減少記憶體佔用
14 SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
15
1 private void timer1_Tick(object sender, System.EventArgs e)
2 {
3 // 使用定時器將當前實體記憶體佔用(MB)添加到列表框中。
4 string s = string.Format("{0}", Process.GetCurrentProcess().WorkingSet / 1024 / 1024);
5 this.listBox1.Items.Insert(0, s);
6 }
7
8 [DllImport("kernel32.dll")]
9 public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max );
10
11 private void button1_Click(object sender, System.EventArgs e)
12 {
13 // 減少記憶體佔用
14 SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
15 }