Утечка памяти C # RuntimeBinder (динамическое ключевое слово?) - PullRequest
0 голосов
/ 26 февраля 2019

В настоящее время я работаю над огромным проектом C #, взаимодействующим с Excel.Мы обнаружили, что с некоторыми файлами Excel ресурсы памяти растут в геометрической прогрессии.Через 2 или 3 часа происходит сбой Excel.

Я установил ANT Memory Profiler, который, как мне показалось, неплохо анализировал утечки памяти в проектах C #, и я был довольно смущен, увидев, что все утечки происходят из классов, о которых я никогда не слышал.

Эта ссылка довольно хорошо суммирует результаты, которые я получаю: Переполнение памяти: увеличение количества Microsoft.CSharp.RuntimeBinder.Semantics

Ссылка говорит, чтопроблема может возникнуть из-за использования динамического ключевого слова.НО проблема в том, что мы не используем это ключевое слово в нашем коде.

Однако мы используем: Microsoft.Office.Interop.Excel, что является DLL, нам нужно взаимодействовать с Excel.Изучив их код, мы увидели, что это динамическое ключевое слово используется в некоторых их классах для определения их свойств.Мы последние используем те же свойства в нашем коде в нескольких местах.Но это означает, что у нас нет власти над этими свойствами, и что мы не можем использовать решения, предложенные в последней ссылке или даже в этой: Утечка в RuntimeBinder при использовании ключевого слова dynamic с __ComObject

Например, он определен следующим образом в dll:

dynamic ActiveSheet { get; }

, и мы используем его следующим образом (рабочий лист является объектом Excel.Worksheet):

worksheet = theWorkbook.ActiveSheet;

Кроме того, я даже не знаю, происходит ли проблема из-за этих динамических ключевых слов, поэтому, возможно, я полностью отвлекаюсь от реального решения.

Редактировать

Я не могу знать вкаким методом происходит сбой, мы используем потоки для вызова API, информация, которую мы восстанавливаем, помещается в ячейки Excel.API вызывается несколько раз в секунду.Поэтому я думаю, что некоторые данные хранятся в памяти, когда ячейка обновляется, а не удаляется.

Вот экран, который дает мне профилировщик ANT:

enter image description here

Так как мы никогда не используем эти классы CSharp, я не знаю, что является источником этих утечек, и в каком методе это происходит, и, поскольку это многопоточное и автоматизированное средство, нет никаких действий пользователя, которые могли бы сообщить нам, когдаименно утечка происходит.

Мы используем Marshal.ReleaseComObject везде, где можем, но я думаю, что легко пропустить один ... Требуется проверка

...