Как управлять памятью в c # и COM объектах - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть несколько вопросов, как работает сборщик мусора в приложениях C #

Приложение выполняет тяжелые операции ввода-вывода и базы данных в течение 10 дней.

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

Мне как-то нужно использовать 32-битные API-интерфейсы, где память ограничена 2 ГБ, и оставляя другие ресурсы, наше приложение в этом обсуждении может выйти из строя, если оно начнет отображаться с объемом 1,5 ГБ.

Для управляемых ресурсов я могу легко вернуть память, которая используется после каждой итерации в цикле. Но когда дело доходит до компонентов COM, которые я использую для геообработки, очень непоследовательно, как освобождается память. Я забочусь о том, чтобы выпустить все виды COM-объектов после использования их в заданной итерации, и все же я получаю ошибку, такую ​​как «недостаточно памяти». Поэтому после примерно 300-400 итераций [каждая итерация занимает некоторое время, близкое к нескольким минутам), мне нужно только закрыть и открыть снова, чтобы освободить все ресурсы.

Я предоставлю больше информации, если кто-то захочет больше слушать.

Основная проблема, которую я хочу решить, состоит в том, как последовательно возвращать всю свою память после каждой итерации, скажем, в цикле for, очистив все, особенно с COM-объектами.

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 09 декабря 2018

Спасибо, Кирк, за помощь. Я приму это как постоянное решение этой проблемы. Но я могу собрать память для остальных классов, если она выходит за рамки C #. Нам нужно было осторожно выяснить, где открываются все курсоры, и сразу же освободить память, как только ее использование будет завершено. Проблема, которая у меня возникла, связана с некоторым устаревшим кодом и множеством глобальных переменных, объявленных для классов arcobjects, которые не освобождают память. Тем не менее я заметил, что IFeatureClass не освобождает память. Но сейчас я могу динамически очищать память, что позволяет процессу продолжаться как можно дольше.

...