2011-07-22 5 views
0

Je crois qu'il y a une fuite de mémoire avec le TypedFactoryInterceptor.Windsor TypedFactoryInterceptor Memory Leak

S'il vous plaît envisager le scénario suivant:

[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(); 
     } 
    } 
} 

Dans l'exemple ci-dessus, la TypedFactoryInterceptor contiendra une liste de 100000 WeakReferences, qui pointent tous à la même instance cible (de MySingleton). Ainsi, dans le scénario où un singleton dépend d'une fabrique pour créer des instances d'un autre singleton, vous pouvez vous retrouver avec des centaines de milliers de WeakReferences et donc une fuite de mémoire.

En faisant quelques regardant le code source, il semble que le problème est ici (en TypedFactoryInterceptor.Resolve):

Toute pensée?

Merci.

Répondre

1

C'est le résultat de l'astuce avec WeakReference étant une solution de contournement pour les limitations architecturales dans Windsor 2.5 plutôt qu'une solution complète.

Ceci est corrigé dans (à venir) Windsor 3, où aucun WeakReference n'est impliqué. En guise de solution de contournement temporaire, je suppose que votre meilleure option est de ne pas utiliser d'usine pour ce singleton (ou de mettre à niveau vers Windsor 3).

+0

Y at-il une source d'information sur Windsor 3? Je n'arrive pas à en trouver sur google? – Jeff

+0

quelles sortes d'informations? C'est toujours Windsor, vous l'utilisez à peu près de la même manière, la liste des changements est dans changelog, les changements de rupture sont listés dans breakingchanges.txt ... –

+0

mais je vais devoir construire la source, non? il n'y a pas de version bêta officielle ou quoi que ce soit? – Jeff