C # Как сообщить о неспецифическом использовании памяти - PullRequest
1 голос
/ 01 октября 2010

Итак, я пытаюсь продемонстрировать своим сотрудникам, что продукт содержит утечку памяти. Тем не менее, требуется около 2 часов запуска сценария, который касается COM-объекта, для дублирования до OutOfMemoryException. Чтобы сделать это презентабельным, мне понадобятся данные для базового уровня, чтобы показать, что не сам скрипт вызывает проблемы с памятью, а также данные, показывающие, что поведение действительно дублирует утечку памяти.

Я планирую сделать это с помощью периодического отчета об общем использовании памяти, записанного в файл журнала. Например, в этом окне вкладка «Диспетчер задач Windows» -> «Производительность» показывает, что в настоящее время используется 1,67 ГБ из 2,00 ГБ. Это число, которое мне нужно извлекать из моего кода и периодически выгружать в файл журнала.

Только одна проблема ... как мне получить эту информацию?

Спасибо за любую помощь, которую вы можете оказать, даже если она скажет мне, что это невозможно: P.

ОБНОВЛЕНИЕ : Спасибо за информацию о проблемах памяти COM, но "базовый уровень", о котором я говорю, также касается объекта COM практически идентичными способами и не вызывает проблем с памятью на порядок что конкретное поведение делает. Здесь мне могут помочь только ответы на поставленный мной вопрос.

1 Ответ

1 голос
/ 01 октября 2010

Обновление: , В ответ на вопрос ОП у класса System.GC есть метод получения оценки количества используемой памяти:

System.GC.GetTotalMemory(false)

Если вы используете COM в длительном процессе (то есть без простоя), то будет испытывать утечку памяти, если вы периодически не звоните:

Thread.CurrentThread.Join(100);

100, конечно, можно изменить, но это будет то, как долго ваша активная нить "спит" перед возобновлением. Из документов:

Блокирует вызывающий поток до тех пор, пока поток не завершится или не истечет указанное время, продолжая при этом выполнять стандартную откачку COM и SendMessage.

Это последний пункт, который является ключевым.

Ссылка: http://support.microsoft.com/kb/828988

Если консольное приложение, основанное на однопотоковой квартире (STA), создает, а затем использует компоненты объектной модели компонентов (COM) STA, и консольное приложение не выполняет достаточных операций для прокачки сообщений COM, таких как вызов монитора Метод .Enter, метод Thread.Join и другие могут вызывать следующие симптомы. Кроме того, если консольное приложение выполняет операции, которые выполняются в течение длительного времени и не перекачивают сообщения, такие как вызов метода Console.ReadLine, могут возникнуть следующие симптомы:

  • Выпуск COM-компонентов может быть отложен.
  • Вызовы методов Finalize объектов, которые собирает сборщик мусора, могут быть отложены.
  • Вызовы COM-компонентов могут блокировать поток приложения на длительные периоды времени. Объем памяти, используемый процессом приложения STA, может со временем увеличиваться.
  • Вызов метода GC.WaitForPendingFinalizers может занять много времени для возврата.
...