gpt4 book ai didi

c# - 带有 IDisposable 的简单 ConsoleProgram - 没有内存减少 - 我们有泄漏?

转载 作者:行者123 更新时间:2023-11-30 15:03:14 24 4
gpt4 key购买 nike

我有一个简单的 ConsoleProgram,它正在创建一个包含 80 个 IDisposable 对象的列表。此对象包含两个 System.Threading.ManualResetEvent,它们在 Dispose() 方法中关闭。请考虑代码:

public class Program
{
private static void Main(string[] args)
{
Console.ReadLine();
Test(80);
Console.WriteLine("end.");
Console.ReadLine();
}

private static void Test(int c)
{
Console.WriteLine("Test start.");

List<TestObject> list = new List<TestObject>();

for (int i = 0; i < c; i++)
list.Add(new TestObject());

Console.WriteLine("End of adding. Added: {0} items.", c);
Console.ReadLine();

foreach (TestObject obj in list)
obj.Dispose();

list = null;
Console.WriteLine("Dispose end.");
}

public class TestObject : IDisposable
{
public ManualResetEvent mr1 = new ManualResetEvent(true);
public ManualResetEvent mr2 = new ManualResetEvent(false);

public void Dispose()
{
mr1.Close();
mr2.Close();
}
}
}

我已经测试了我的程序以防消耗内存和内存泄漏。我认为在创建所有列表对象后消耗的内存会增加,但在调用 Dispose() 方法并将 null 值设置为列表对象后它会减少。不幸的是,我有观察者不同的行为。请考虑我的以下测试结果:

  1. 程序启动(未创建任何内容)。 WorkingSet = 6.700K
  2. 创建了 80 个对象的列表。 WorkingSet = 7.160K(内存增长:460K)
  3. 程序调用了 Dispose() 方法并将 null 设置为列表对象。 WorkingSet = 7.164K(最后一点内存增长:4K)
  4. 程序挂起超过 20 分钟。 WorkingSet = 7.296K(内存从最后一点增长:105K,内存从开始增长:596K)
  5. 项目已结束。

第3点和第4点我真的很困惑,为什么内存没有释放?我认为这是内存泄漏,因为总内存增长等于 596K 并且从未释放。

非常感谢您的回答。

附言。更改对象数量(例如更改为 9000)会导致内存增长超过 2MB。

PS2。在我的程序结束时,我调用 GC.Collect() 来强制清理。但是在那之后使用的内存量仍然相同并且没有减少 - 我很困惑。

最佳答案

调用 Dispose() 并将值设置为 null 不会立即释放内存。当垃圾收集器下次运行时,你的内存应该被释放,但这个时间是不确定的。通常,它会在应用程序处于内存压力下时发生,通常是由于创建对象需要更多内存。如果没有这种压力,并且应用程序处于空闲状态,GC 可能永远不会收集您的内存。

简而言之,这不是内存泄漏。

关于c# - 带有 IDisposable 的简单 ConsoleProgram - 没有内存减少 - 我们有泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11861553/

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