gpt4 book ai didi

C# 托管内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:28 25 4
gpt4 key购买 nike

我有一个简单的类:

public partial class MainWindow : Window
{
MyClass c1, c2, c3;
public MainWindow()
{
InitializeComponent();
}

private void Button1_Click(object sender, RoutedEventArgs e)
{
c1 = new MyClass();
c2 = new MyClass();
c3 = new MyClass();
}

private void Button2_Click(object sender, RoutedEventArgs e)
{
c1 = null;
c2 = null;
c3 = null;
GC.Collect();
}
}

class MyClass
{
String[] s;
public MyClass()
{
s= new String[1000000];
}

}

当我单击 button1 时,托管内存(所有堆计数器中的字节数,perfmon)正在增长(如预期的那样)。但是当我单击 button2 时,我希望应该释放托管内存。但是它也长大了!!只有在点击第二个 button2 后,内存才会释放。对此行为的解释是什么?

为什么在应用程序刚启动时,“所有堆中的字节数计数器”为 0?我认为它应该大于 0 。托管堆上已经分配了一些对象。主窗口例如..谢谢大家

最佳答案

如果调用 GC.Collect,将不会释放任何内存。没 Root过的对象只会存储在队列中以待释放。阅读一些关于:GC.WaitForPendingFinalizers Method () 的内容

另请注意,大小超过 ~82MB 的对象将自动存储在 gen2 中,因此据我所知不会自动收集它们。

还有一个用于大型对象的堆,称为:大型对象堆 (LOH)。有关更多信息,请查看:Why Large Object Heap and why do we care?

希望这些信息对您有所帮助。

关于C# 托管内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33667238/

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