我在 .NET CF 应用程序中遇到内存泄漏问题。
使用RPM我发现动态创建控件不会像预期的那样被垃圾收集。在 .NET 窗口窗体中运行同一段代码的行为会有所不同,并且会按我的预期处理控件。
通过 PerfMon 查看 RPM 的输出以了解进程堆计数器:
GC 堆:
我最好的猜测是,对面板的弱引用是由于某种未知的原因导致对象没有资格进行 GC,可以吗?
请注意:尽管Dispose()解决了示例的问题,但我无法轻松地将其合并到现有应用程序中,因为它无法明确确定对象何时不再使用。
我已经包含了一个简化版本的源代码来说明这个问题:
using System;
using System.Windows.Forms;
namespace CFMemTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// Calling this event handler multiple times causes the memory leak
private void Button1_Click(object sender, EventArgs e)
{
Panel uc = new Panel();
// Calling uc.Dispose() cleans up the object
}
}
}
更新:
1. 调用 GC.Collect() 也不会导致面板被清理。
2. 在 Windows CE 4.2 设备上使用 .NET CF 2.0 SP1。