.NET-версия Java assertGC: модульное тестирование утечек памяти - PullRequest
3 голосов
/ 13 августа 2010

Я пытаюсь написать модульный тест, используя .NET 4, чтобы гарантировать, что объект может быть подвергнут сборке мусора после запуска некоторого кода. В Java я бы использовал assertGC, чтобы гарантировать сбор слабых ссылок. Как я могу написать этот тип теста для .NET?

Я пытался сохранить WeakReference объекта и вызвать GC.Collect(), но, как и следовало ожидать, иногда мой объект собирается, а иногда нет. Обратите внимание, что это для модульного теста, а не для производственного кода. Я не хотел бы GC.Collect () в моей реальной базе кода.

Я использую C #, но тот же ответ будет хорошо и для VB.NET.

Ответы [ 2 ]

1 голос
/ 13 августа 2010

Попробуйте это:

Работает без перерыва 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();
    }
}
0 голосов
/ 25 августа 2010

Похоже, что в настоящий момент это невозможно с .NET 4. Хотя можно узнать, нельзя ли собрать мусор с объекта (например, иметь ссылку на него), нет способа детерминистически узнать, является ли объект объект можно собирать мусором.

Используя WeakReference или финализатор (и вызывая GC.Collect ()) может собрать объект, но если он не находится в поколении 0, есть большая вероятность, что он не будет.

Ссылки:

...