2015-08-20 147 views
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)。

+0

http://stackoverflow.com/questions/17130382/understanding-garbage-collection-in-net/17131389#17131389 –

回答

0

看起来像Stream类中的问题。据我可以从不同的测试理解,它锁定byte阵列,这是写入流。并且它不关闭或在using区块外发布。 如果使用FileIO代替Stream和更改倾销代码:

// Dump input images 
for (int i = 0; i < frames.Length; i++) 
{ 
    StorageFile file = await Windows.Storage.KnownFolders.PicturesLibrary.CreateFileAsync(
     string.Format("FRAME_{0}.yuv", i), CreationCollisionOption.ReplaceExisting); 

    byte[] image = SwapHeap.copyFromHeap(frames[i].ImagePtr, (int)frames[i].Width * (int)frames[i].Height * 3/2); 
    await FileIO.WriteBytesAsync(file, image); 
    image = null; 
    file = null; 
} 

一切都很好。