[心得] C#大記憶體使用

看板C_Sharp (C#)作者 (.)時間8年前 (2016/12/10 01:09), 8年前編輯推噓2(200)
留言2則, 2人參與, 最新討論串1/1
using System.Runtime.InteropServices; unsafe private void button3_Click(object sender, EventArgs e) { for(int i= 0; i < 100; i++) { byte * btest = (byte*)Marshal.AllocHGlobal(sizeof(byte) * 1024 * 1024 * 10 * 10 ); for (int x = 0; x < 1024 * 1024 * 100; x++ )btest[x] = 0; //上面這行可以註解掉觀察記憶體使用量 Marshal.FreeHGlobal((IntPtr)btest); //上面這行可以註解掉觀察記憶體使用量 } } 有了 Marshal的AllocHGlobal與FreeHGlobal c#玩轉指標其實變得很方便 不過對managed世界中實際上怎麼處理對待unmanaged的記憶體管理 有些細節不是很清楚 於是寫了SAMPLE做實驗 簡單歸納一些結論好了 1.Marshal.AllocHGlobal之後會佔用多一點記憶體,但系統資源觀察(工作管理員) 並非是所有配置的記憶體都會被佔用到,要一直到對記憶體有存取後, 系統資源才會真正被佔據. 2.就算你不使用Marshal.FreeHGlobal歸還記憶體, 所佔據的記憶體最後還是會在你關閉掉程式後歸還給系統. (前提是如果你能保證執行過程不會爆掉,最後關閉掉結果都是一樣, 不會有資源被無端佔用的狀況) 3.x64環境 + x64執行設定 + 比較新的 .net framework 可以享用好幾GB的記憶體資源,有沒有上限我不知道,這sample一觸發, 工作管理員就從5g->到快15g,如果你要跑啥很了不起的科學運算,有錢的話, 記憶體插滿,我猜應該是可以享用到足夠的記憶體,但不知道OS層有沒有管理限制. 這對於特殊需求的人來說應該是好消息. (記憶體插滿ddr4,有錢買單條32g的,滿4條,128g..) 4.只Marshal.AllocHGlobal,不真正使用記憶體,但也不FREE掉, 雖然工作管理員顯示只多一點點的記憶體(約幾MB而以), 按個幾次程式還是會報錯CRASH掉. ※ 編輯: erspicu (61.70.88.120), 12/10/2016 01:45:59

12/10 19:35, , 1F
推推
12/10 19:35, 1F
※ 編輯: erspicu (61.70.88.120), 12/10/2016 19:38:12

12/15 08:43, , 2F
謝分享
12/15 08:43, 2F
文章代碼(AID): #1OIkLDWO (C_Sharp)
文章代碼(AID): #1OIkLDWO (C_Sharp)