2009-12-03 4 views
0

La fuite de mémoire ne se produit pas sur chaque machine, mais de manière fiable sur un couple à mon travail, et cela ressemble à près de 10% sur le terrain. J'ai un produit qui utilise un service Windows pour surveiller les entrées utilisateur pour lancer des alertes, associé à une application visuelle qui ne sert qu'à s'asseoir dans la barre d'état système, et permettre à l'utilisateur d'apporter des modifications à la configuration.Comment trouver une fuite de mémoire distante .NET sur certaines machines?

J'ai choisi d'utiliser un objet distant pour partager les informations de configuration entre les deux processus. Dans le service, il s'appelle serviceConfig, et dans l'application visuelle, il s'appelle configData. L'objet est créé sur le serveur d'abord, puis télécommandables comme suit:

try 
{ 
    InitializeComponent(); 
    setAppInitDLL(thisDirectory); 
    serviceConfig = new serviceConfigData(); 
    Regex getVersion = new Regex("Version=(?<ver>[^,]*)"); 
    if (getVersion.IsMatch(Assembly.GetExecutingAssembly().FullName)) 
    { 
     serviceConfig.Version = new Version(getVersion.Match(Assembly.GetExecutingAssembly().FullName).Result("${ver}").ToString()); 
    } 
    // Create the server channel for remoting serviceConfig. 
    serverChannel = new TcpServerChannel(9090); 
    ChannelServices.RegisterChannel(serverChannel, false); 
    RemotingServices.Marshal(this.serviceConfig, "ServiceConfigData"); 
    baseLease = (ILease)RemotingServices.GetLifetimeService(serviceConfig); 
    lock (Logger) { Logger.Write(String.Format("The name of the channel is {0}", serverChannel.ChannelName)); } 

    lock (Logger) { Logger.Write("Exiting Constructor"); } 
} 
catch (Exception ex) 
{ 
    lock (Logger) { Logger.Write(String.Format("Error in Constructor:{0}", ex.Message)); } 
} 

Puis dans l'application visuelle j'ai un objet privé que je connecter à l'aide:

configData = (serviceConfigData)Activator.GetObject(typeof(serviceConfigData), "tcp://localhost:9090/ServiceConfigData"); 

Lors de la lecture ou de l'écriture à cette objet, j'ai des instructions catch pour Socket Exceptions et Remoting Exceptions qui appellent alors cette même déclaration.

Sur la plupart des machines, cela fonctionne sans fuites de mémoire, mais sur certains, il fuit très rapidement. Toutes les machines au travail ont .NET 3.5, certains sont XP, un couple sont Vista. Le problème n'a été vu sur les machines XP, et les machines sur le terrain sont tous XP.

Des idées où je devrais regarder, et comme une question secondaire, devrais-je utiliser quelque chose de complètement différent de cela?

Répondre

0

Ma première pensée serait de profiler l'application sur les machines que vous voyez la fuite avec quelque chose comme Red Gate's Memory Profiler.

Ce sera beaucoup plus fiable que d'essayer de deviner quelle pourrait être la fuite. Pour choisir la bonne technologie, si vous avez installé .NET 3.5 sur toutes vos machines, vous pouvez envisager de migrer vers WCF (principalement des canaux nommés) pour votre communication inter-processus. Vérifiez this SO post pour plus de détails ...

+0

Lutter avec .NET Memory Profiler en ce moment, jamais utilisé auparavant, et je vois sous Types/Ressources tout est sous Namespace/Système: Noyau, Nom/Ressource: HeapMemory. Lorsque je sélectionne cela, il montre un nombre croissant d'instances. Cela semble être directement proportionnel au nombre de fois que j'utilise get ou set sur l'un des paramètres publics de l'objet distant. – mlusby

+0

Impossible de trouver le problème, même avec les profileurs de mémoire (probablement en raison de mon inexpérience avec eux), se déplaçant vers des tubes nommés. – mlusby

Questions connexes