gpt4 book ai didi

c# - 为什么不处理 MemoryStream?

转载 作者:行者123 更新时间:2023-12-04 10:29:47 33 4
gpt4 key购买 nike

我正在尝试使用 dotMemory 进行一个简单的测试。我希望以下测试能够通过:

[Test]
public void MemoryStream_is_disposed()
{
using (var stream = new MemoryStream()) { }
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
dotMemory.Check(memory => memory.GetObjects(where => where.Type.Is<MemoryStream>()).ObjectsCount.Should().Be(0));
}

但事实并非如此!

enter image description here

为什么,我需要做什么才能通过测试?

这可能就是我的代码中存在内存泄漏的原因。

最佳答案

已处理和符合垃圾收集条件意味着两件不同的事情。特别是您的 stream有资格进行垃圾回收,不是因为它已被处理,而是因为在您调用 GC.Collect 时您没有对该对象的未完成引用。 .

但是,正如@alexeilevenkov 指出的那样,GC 的 Debug 版本在标记阶段没有那么激进,当引用在函数范围内时保持引用处于事件状态(允许您检查流引用直到函数结束)。符合垃圾收集条件意味着,对象可能会被垃圾收集。但是,由 GC 决定何时实际收集内容。

事实上,在 Release模式下,即使引用该对象的变量仍在范围内,该对象也可能符合收集条件并被收集。如果一个对象被创建,分配给一个变量,并在一个范围的顶部附近使用,但在该范围内不再使用,则该对象可能在变量超出范围之前被收集。

除了在对对象的最后一个事件引用完成之后才能收集对象的规则之外,您不应该对收集发生的时间做出任何假设。

为什么你认为你的代码中有内存泄漏?在托管代码中检测真正的内存泄漏很困难

关于c# - 为什么不处理 MemoryStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60468882/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com