C# 如何在选定的计算机上查找.NET远程处理内存泄漏?

C# 如何在选定的计算机上查找.NET远程处理内存泄漏?,c#,.net,windows-services,memory-leaks,remoting,C#,.net,Windows Services,Memory Leaks,Remoting,内存泄漏并不是发生在每台机器上,而是发生在我工作的几台机器上,在现场看起来接近10% 我有一个产品,它使用Windows服务来监视用户输入以启动警报,并与一个仅用于放置在系统托盘中的可视应用程序相匹配,允许用户进行配置更改 我选择使用远程对象在两个进程之间共享配置信息。在服务中称为serviceConfig,在可视应用程序中称为configData。首先在服务器上创建对象,然后按如下方式进行远程操作: try { InitializeComponent(); setAppInit

内存泄漏并不是发生在每台机器上,而是发生在我工作的几台机器上,在现场看起来接近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)); }
}
在读取或写入此对象时,我有用于套接字异常和远程处理异常的catch语句,它们随后调用同一语句

在大多数机器上,这种方法不会泄漏内存,但在某些机器上,它泄漏得很快。所有工作的机器都有.NET3.5,一些是XP,一些是Vista。这个问题只在XP机器上出现过,而且该领域的机器都是XP


有什么想法我应该在哪里寻找,作为第二个问题,我应该使用与此完全不同的东西吗?

我的第一个想法是在您看到泄漏的机器上配置应用程序,例如

这比猜测泄漏的原因要可靠得多


至于选择正确的技术,如果所有机器都安装了.NET 3.5,您可能需要考虑迁移到WCF(主要命名为管道)来进行进程间通信。查看更多详细信息…

目前正在与.NET内存探查器搏斗,以前从未使用过,我看到在类型/资源下,它都位于名称空间/系统:内核、名称/资源:HeapMemory下。当我选择此选项时,它显示了快速增长的实例数。这似乎与我对远程对象中的任何公共参数使用get或set的次数成正比。即使使用内存探查器(可能是因为我对它们缺乏经验),移动到命名管道,似乎也找不到问题。
configData = (serviceConfigData)Activator.GetObject(typeof(serviceConfigData), "tcp://localhost:9090/ServiceConfigData");