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

作者: erspicu (.)   2016-12-10 01:09:29
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
作者: neo5277 (I am an agent of chaos)   2016-12-10 19:35:00
推推
作者: DrumMania (Rock'n'Roll)   2016-12-15 08:43:00
謝分享

Links booklink

Contact Us: admin [ a t ] ucptt.com