3
我有8个大块内存(每个28mb)。它们存储在非托管(本机)代码中。我想将它们转储到文件中。但是,在我转储它们之后,它们不会被释放,并且我有230MB的繁忙内存,无法继续运行我的应用程序。进一步抛出OutOfMemory。 这里我倾销代码:Windows Phone 8.1内存问题
//* Dump input images
for (int i = 0; i < frames.Length; i++)
{
StorageFile file = await localFolder.CreateFileAsync(
string.Format("FRAME_{0}.yuv", i),
CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenStreamForWriteAsync())
{
byte[] image = SwapHeap.copyFromHeap(frames[i].ImagePtr, (int)frames[i].Width * (int)frames[i].Height * 3/2);
await stream.WriteAsync(image, 0, image.Length);
await stream.FlushAsync();
image = null;
}
}
...
System.GC.Collect();
和本地代码从int
指针得到byte[]
:
Array<uint8>^ SwapHeap::copyFromHeap(const int ptr, int length)
{
Array<uint8>^ res = ref new Array<uint8>(length);
memcpy(res->Data, (byte*)ptr, length);
return res;
}
我在本机代码可用内存使用free((byte*)ptr);
和它的确定。但我不明白,为什么byte
数组没有发布?
P.S.我可以使用本地代码转储数据,但我想了解GC的工作原理(我已经阅读过MSDN)。
http://stackoverflow.com/questions/17130382/understanding-garbage-collection-in-net/17131389#17131389 –