如何在选定的计算机上找到.NET远程内存泄漏?

时间:2009-12-03 14:12:45

标签: c# .net windows-services memory-leaks remoting

每台机器上都没有发生内存泄漏,但在我工作的情况下,一对夫妇的内存泄漏可靠,而且现场看起来接近10%。

我有一个产品,它使用Windows服务来监控用户输入以启动警报,与仅用于放置在系统托盘中的可视应用程序配对,并允许用户进行配置更改。

我选择使用远程对象来共享两个进程之间的配置信息。在服务中,它被称为serviceConfig,在可视化应用程序中,它被称为configData。首先在服务器上创建对象,然后按如下方式进行远程处理:

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

然后在可视化应用程序中,我有一个使用以下连接的私有对象:

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

当读取或写入此对象时,我会捕获Socket Exceptions和Remoting Exceptions的语句,然后调用同样的语句。

在大多数机器上,这可以在不泄漏内存的情况下工作,但在某些机器上它会很快泄漏。所有正在运行的机器都有.NET 3.5,有些是XP,有些是Vista。这个问题只出现在XP机器上,现场的机器都是XP。

我应该关注的任何想法,作为次要问题,我应该使用与此完全不同的东西吗?

1 个答案:

答案 0 :(得分:0)

我的第一个想法是用Red Gate's Memory Profiler之类的东西在你看到漏洞的机器上分析应用程序。

比试图猜测泄漏可能会更加可靠。

至于选择合适的技术,如果您的所有计算机都安装了.NET 3.5,您可能需要考虑迁移到WCF(主要是命名管道)以进行进程间通信。查看this SO post了解更多详情...