[心得] 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