Windsor TypedFactoryInterceptor Утечка памяти - PullRequest
0 голосов
/ 22 июля 2011

Я полагаю, что произошла утечка памяти с TypedFactoryInterceptor.

Пожалуйста, рассмотрите следующий сценарий:

[Factory]
public interface IMyFactory 
{
     MySingleton GetInstance();
}

[Singleton]
public class MySingleton
{
}

[Singleton]
public class MyController
{
    public MyController(IMyFactory factory)
    {
        // using a for loop to simulate repeated calls to the factory instance over
        // a long time
        for(int i = 0; i < 100000; i++)
        {
            var instance = factory.GetInstance();
        }
    }
}

В приведенном выше примере TypedFactoryInterceptor будет содержать список 100000 WeakReferences,все из которых указывают на один и тот же объект Target (MySingleton).Таким образом, в сценарии, где один синглтон зависит от фабрики по созданию экземпляров другого синглтона, вы можете получить сотни тысяч WeakReferences и, как следствие, утечку памяти.

При просмотре исходного кода,похоже, проблема здесь (в TypedFactoryInterceptor.Resolve):

// this is called on every Resolve call to the TypedFactory (IMyFactory.GetInstance)
if (this.kernel.ReleasePolicy.HasTrack(instance))
{
    // there will not be any dead references because MySingleton is a Singleton
    this.CollectDeadReferences();
    // adds another WeakReference to the same Singleton instance
    this.resolvedTrackedComponents.Add(new WeakReference(instance));
}

Есть мысли?

Спасибо.

1 Ответ

1 голос
/ 22 июля 2011

Это результат уловки с WeakReference s как обходной путь для архитектурных ограничений в Windsor 2.5, а не как полноценное решение.

Это исправлено в (готовящемся) Windsor 3, где нет *Вовлечено 1004 * с.

В качестве временного обходного пути, я думаю, ваш лучший вариант - не использовать фабрику для этого синглтона (или перейти на Windsor 3).

...