4

我正在维护一个用 C# 编写的视频应用程序。我需要尽可能多地控制大内存缓冲区(数百兆字节)的内存分配/释放。

如其所写,当需要释放像素数据时,像素缓冲区设置为空。有没有更好的释放内存的方法?垃圾收集大对象的成本很高吗?

谢谢!

4

3 回答 3

3

不要扔掉这样的大缓冲区,你很幸运拥有它。视频提供了很多重复使用的机会。在确定不再需要之前不要丢失缓冲区。在这一点上,它何时被收集并不重要。

于 2011-03-07T18:55:22.357 回答
1

据我所知,垃圾收集大对象的成本非常高。根据我的阅读,它们在分配时自动成为第 2 代(它们被分配在大对象堆中)。并且由于它们很大,它们迫使频繁的第 2 代收集。

所以我宁愿为位图数组实现手动池化,甚至使用非托管内存。Dispose有一些池类并在像素/位图类中将数组返回给它。

于 2011-03-07T18:25:55.650 回答
1

对于这么大的内存块(“数百兆字节”),应该很容易准确地知道谁和在哪里使用它们(无论如何,你只能在内存中容纳 10-20 个这样的块)。由于 ypu 计划使用如此多的内存,您需要仔细预算内存使用量 - 即整个缓冲区的简单副本将花费大量时间。

完成特定块后,您可以自己强制 GC。这听起来像是对 GC.Collect API 的合理使用——你已经使用了所有可用内存的很大一部分。

如果它适用于您的应用程序,您也可以考虑切换到分配更小的 (64k) 块并将它们链接在一起。这将更好地与垃圾收集保持一致,并可能为您的应用程序提供更大的灵活性。

于 2011-03-07T19:02:59.623 回答