作者erspicu (.)
看板C_Sharp
标题[心得] C#大记忆体使用
时间Sat Dec 10 01:09:29 2016
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
1F:推 neo5277: 推推 12/10 19:35
※ 编辑: erspicu (61.70.88.120), 12/10/2016 19:38:12
2F:推 DrumMania: 谢分享 12/15 08:43