setlength(0)和MemoryStream.Capacity = 0 don't清除已用内存

本文关键字:清除 内存 don MemoryStream Capacity setlength | 更新日期: 2023-09-27 18:04:44

我有一个流式媒体程序,它创建了两个巨大的MemoryStreams,然后需要在完成后将它们归零。问题是,在我调用BOTH MemoryStream.SetLength(0)后,内存似乎没有被回收;和MemoryStream。容量= 0。GC.Collect()似乎解决了这个问题,但我听说这是糟糕的编程实践,因为它会导致应用程序中的所有线程挂起;虽然挂起的线程在短时间内不会成为问题,但清除内存需要时间。然而,如果有另一个解决问题的方法,那就太好了。有什么建议吗?

setlength(0)和MemoryStream.Capacity = 0 don't清除已用内存

GC.Collect()似乎解决了这个问题

所以没有问题…为什么您认为需要强制GC立即收集内存?当系统认为有必要时,就会这样做。不要试图智取GC;)

您可以使用Write方法用零填充内存,然后调用Flush,然后调用MemoryStream的Close或Dispose方法,如果您担心流中剩余的数据在被处置后仍将留在内存中。(是的,对于巨大的内存流,它会变慢,但是您应该只有在通过分析确定它是否会在程序中导致真正的性能问题之后才关心这个问题。)

如果您确实需要手动管理内存,则使用UnmanagedMemoryStreamMarshal.AllocHGlobal分配的内存。

可以在内存流上调用dispose吗?否则我会说,除非当你做gc时perf是不可接受的。收集,去做吧。我们有一个类似的情况,客户发现"让gc做它的事情"的解释是不可接受的。尤其是在没有伤害的情况下,按顾客的要求去做。