代码之家  ›  专栏  ›  技术社区  ›  Philip Fourie

.netcf内存泄漏-创建动态控件?

  •  1
  • Philip Fourie  · 技术社区  · 17 年前

    我在.NET CF应用程序中遇到内存泄漏问题。

    使用 RPM 我发现动态创建控件并不像预期的那样被垃圾收集。在.NET窗口窗体中运行同一段代码的行为不同,并按我预期的那样处理控件。

    有关 进程堆 计数器:
    alt text

    GC堆:
    alt text

    我的最佳猜测是,对面板的弱引用是由于某种未知的原因,使对象不符合GC的条件,可以吗?

    请注意: 尽管 处置() 解决了这个示例的问题,我不能很容易地将它合并到现有的应用程序中,因为它无法确定对象何时不再使用。

    我已经包含了一个简化版本的源代码来说明这个问题:

    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。

    4 回复  |  直到 17 年前
        1
  •  3
  •   Philip Fourie    17 年前

    这里还有一些解释这种行为的附加信息。

    According to Ilya Tumanov :

    与netcf相关的所有用户界面都是 有意从GC范围中删除,因此 从来没有收集过 . 这种行为 不同于桌面 在netcf v3.5中更改(除非正在运行 在兼容模式下)。

    它是如此不同,因为托管的用户界面 netcf上的类完全是 与桌面不同。他们很瘦 本地实现的包装器 为了达到可接受的程度 性能。

    我不确定是否有这样的资源。 但实际上,你只需要知道: 它从未收集,必须呼叫 处置。你真的应该这么做 也在桌面上,但如果您不 更为宽容。不是这样 NETCF

        2
  •  2
  •   ctacke    17 年前

    表单不会自动释放在其代码中创建的所有控件,因为它无法知道它的存在。若要使窗体到窗体以在释放时自动释放它,需要将其添加到控件集合中。

    现在,在你的情况下,那可能什么都不做。我不知道你的例子是人为的,还是真实的。如果它是真实的,那么行为是预期的,因为当变量超出范围时面板不会被收集(也不确定它是否在桌面上)。它可以用于收集,但这只意味着在下次收集通过时,它将被扫描。除非你引起GC,否则它不会被释放。

    我强烈建议你看看 MSDN webcast on memory management in the CF . 它提供了一个关于引擎盖下发生的事情的更为全面的解释——远远超过了我们在这里的答案所能提供的。

        3
  •  1
  •   Mitch Wheat    17 年前

    你确定你有内存泄漏吗?.NET Compact Framework垃圾收集器的工作方式与完整.NET Framework中的垃圾收集器略有不同。从 Steven Pratschner's blog :

    集合在以下任一情况下启动:

    • 分配了1MB的对象,

    • 将应用程序移到后台,

    • 分配内存失败

    • 应用程序调用gc.collect。

        4
  •  1
  •   Zhao Wang    17 年前

    我认为您还需要动态删除按钮click eventhandler,如您在本博客中看到的: http://blogs.msdn.com/stevenpr/archive/2007/03/08/finding-managed-memory-leaks-using-the-net-cf-remote-performance-monitor.aspx

    也是史蒂芬·普拉施纳写的。

    顺便说一下,上面提到的网络广播链接在这里: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032318791&CountryCode=US

    希望这有帮助!

    推荐文章