Windows Phone 8.1内存问题
Windows Phone 8.1 memory issue
我有 8 个大内存块(每个 28mb)。它们存储在非托管(本机)代码中。我想将它们转储到文件中。但是在我转储它们之后,它们没有被释放并且我有 230mb 的繁忙内存,这使得无法继续 运行 我的应用程序。进一步抛出 OutOfMemory。
这是我的转储代码:
//* 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)。
Stream
class 中似乎有问题。据我从不同的测试中了解到,它锁定了写入流的 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;
}
一切都很好。
我有 8 个大内存块(每个 28mb)。它们存储在非托管(本机)代码中。我想将它们转储到文件中。但是在我转储它们之后,它们没有被释放并且我有 230mb 的繁忙内存,这使得无法继续 运行 我的应用程序。进一步抛出 OutOfMemory。 这是我的转储代码:
//* 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)。
Stream
class 中似乎有问题。据我从不同的测试中了解到,它锁定了写入流的 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;
}
一切都很好。