代码之家  ›  专栏  ›  技术社区  ›  Andrew

.NET版本的Java AsExtCGC:单元测试内存泄漏

  •  3
  • Andrew  · 技术社区  · 16 年前

    我正在尝试使用.NET 4编写一个单元测试,以确保在运行一些代码之后,对象可以被垃圾收集。在爪哇中,我将使用AsjtGGC来确保收集弱引用。如何为.NET编写这种类型的测试?

    我试过保持 WeakReference 到对象并调用 GC.Collect() 但是正如你所期望的,有时我的对象被收集,有时它不是。请注意,这是用于单元测试,而不是生产代码。我不希望gc.collect()出现在真正的代码库中。

    我使用的是C,但同样的答案也适用于vb.net。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Florian Doyon    16 年前

    试试这个:

    连续运行5分钟,仍然没有例外…您确定您的代码没有在某个地方引用您的对象吗?

    using System;
    
    internal class Program
    {
        private static void Main(string[] args)
        {
            int cnt = 0;
            while (true)
            {
                ++cnt;
                bool gced = false;
                Action handler = () => gced = true;
                new Foo(handler);
                GC.Collect();
                GC.WaitForPendingFinalizers();
                Console.Out.WriteLine("{0} : {1}", cnt, gced);
                if (!gced)
                {
                    throw new Exception("WTF?");
                }
            }
        }
    }
    class Foo
    {
        private readonly Action _onFinalized;
    
        public Foo(Action finalized)
        {
            _onFinalized = finalized;
        }
    
        ~Foo()
        {
            if (_onFinalized != null) _onFinalized();
        }
    }
    
        2
  •  0
  •   Community Mohan Dere    9 年前

    现在看来,使用.NET 4是不可能的。虽然可以知道对象是否不能被垃圾收集(例如,引用它),但无法确定地知道对象是否可以被垃圾收集。

    使用weakreference或finaliser(并调用gc.collect()) 可以 收集对象,但除非它在第0代,否则很有可能它不会。

    参考文献: