Как найти утечку памяти .NET на некоторых компьютерах? - PullRequest
0 голосов
/ 03 декабря 2009

Утечка памяти происходит не на каждой машине, но надежно на паре на моей работе, и в полевых условиях она составляет около 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");

При чтении или записи в этот объект у меня есть операторы catch для Исключений Сокетов и Исключений Удаленного взаимодействия, которые затем вызывают этот же оператор.

На большинстве машин это работает без утечки памяти, но на некоторых оно протекает очень быстро. Все машины на работе имеют .NET 3.5, некоторые XP, пара Vista. Проблема была замечена только на машинах XP, и все машины на местах - XP.

Любые идеи, где я должен искать, и в качестве второстепенного вопроса, должен ли я использовать что-то совершенно отличное от этого?

1 Ответ

0 голосов
/ 03 декабря 2009

Моей первой мыслью было бы профилировать приложение на машинах, которые вы видите утечку, с помощью чего-то вроде Red Gate's Memory Profiler .

Это будет намного надежнее, чем пытаться угадать, какой может быть утечка.

Что касается выбора правильной технологии, если на всех ваших машинах будет установлен .NET 3.5, вы можете рассмотреть возможность перехода на WCF (в первую очередь именованные каналы) для межпроцессного взаимодействия. Проверьте этот SO пост для более подробной информации ...

...