由于大量内存管理问题,Windows Phone 8.1 中的媒体管道似乎已中断。
在 Windows Phone Runtime 8.1 中创建使用 IMediaSource 流式传输音频的后台音频应用程序时,该应用程序的组件最终会在某些情况下抛出 OutOfMemoryException 甚至 StackOverflowException。查看内存转储时,里面有很多未收集的垃圾。
讨论已开始于 MSDN forums并发展到这个结论。我创建了一个 WPDev UserVoice suggestion为了让 Windows Phone 团队能够注意到这一点,但我仍然希望是我(以及来自 MSDN 论坛的其他人)错了,并且有一个解决方案。
我也有一个小CodePlex project这也受此影响,实际上有一个 issue report有关于这个确切的问题。
我希望在社区的帮助下,这个问题可以得到解决或直接传递给微软开发团队进行调查和消除。谢谢!
更新 1:
有一个 kind of workaround for StackOverflowException ,但它对防止 OutOfMemoryException 没有帮助。
最佳答案
好的,看来问题实际上出在 .NET 中字节数组的生命周期上。
为了解决内存问题,应该使用Windows Runtime的Windows.Storage.Streams.IBuffer
.不要以任何形式创建许多新的 .NET 字节数组,也不要通过简单的 new byte[]
,也不通过使用 System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBuffer
类,因为它是 IBuffer
的托管实现界面。
那些字节数组一旦被分配,就会因为被 OverlappedData
固定而存活很长时间。构造并溢出背景音频任务的内存阈值。 IBuffer
s(真正的 Windows 运行时对象,如 Windows.Storage.Streams.Buffer
类)包含 native 数组,一旦 IBuffer
就会被释放。的引用计数达到 0(零),它们不依赖于 GC。
我发现这个问题不仅与背景音频有关。其实我已经看到很多关于类似问题的其他问题。解决办法是到使用 Windows 运行时后端 在可能的情况下,因为它是不受管理的,并且一旦它们有零引用就会释放资源。
感谢@Soonts 为我指明了正确的方向!
关于windows-runtime - Windows Phone 8.1 中的媒体管道是否已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646868/