Инструменты VS VS Diagnosti c измеряют общую память процесса или текущую память процесса - PullRequest
2 голосов
/ 24 февраля 2020

Средства Visual Studio Diagnosti c измеряют общий объем памяти, используемой потоками приложения, или текущую используемую память в данный момент?

У меня есть приложение, которое считывает данные с 34-мегапиксельной камера со скоростью 3 кадра в секунду. Получается математика, что он обрабатывает 288 МБ в секунду, или около 17 ГБ в минуту. Имея это в виду, приложение, очевидно, потребляет много данных, как только оно начинает собирать кадры камеры. Я немного прикоснулся к диагностическим инструментам по причинам, которые вы можете увидеть ниже:

enter image description here

Я позволил приложению работать с профилировщик производительности в течение примерно 3 минут, и в итоге он сообщает об общем объеме памяти процесса около 31 ГБ, как показано ниже:

enter image description here

My Ноутбук имеет только 16 ГБ оперативной памяти, поэтому на первый взгляд я думаю, что приведенная выше картинка в основном отвечает на мой вопрос Тем не менее, сразу после отметки 2: 30 минут вы можете увидеть резкое снижение памяти, что не имеет смысла (я не верю, что что-то изменилось в работе программы). Кроме того, когда я открыл диспетчер задач, я увидел, что мое приложение использует около 9 ГБ памяти, а затем сократило объем памяти до 3 ГБ с отметки 2: 30 мин.

Со всем этим в помните, что на самом деле измеряет Process Memory?


Поскольку решение было скрыто в комментариях к принятому ответу, я кратко опишу решение здесь, для моей общей проблемы, почему моя программа использовала столько памяти. Это было связано с ошибкой, когда я не избавлялся от растровых изображений. Битовые карты - неуправляемая память; если вам не удастся утилизировать их до того, как они go выйдут из области видимости, они продолжат жить в памяти (вне вашего сборщика мусора), пока не будет достигнут порог в количестве неуправляемых объектов. Только при достижении этого порога неуправляемые объекты будут удалены. Это то, что происходило в моей программе, когда она уменьшилась с ~ 31 ГБ памяти до приблизительно 5 ГБ памяти.

1 Ответ

1 голос
/ 24 февраля 2020

Однако, сразу после отметки 2: 30 минут вы можете увидеть резкое снижение памяти, что не имеет смысла (я не верю, что что-то изменилось в том, как работала программа).

Сборка мусора - сложный процесс, который может повлиять на производительность вашего приложения. Таким образом, G C был оптимизирован для запуска только при превышении порога памяти.

При нехватке памяти процесс сборки мусора запускается и очищает ненужные выделения памяти. Это нормальное поведение сборки мусора.

Средства VS VS Diagnosti c измеряют общую память процесса или текущую память процесса?

Измеряет текущее использование памяти приложением. Здесь - это учебник для понимания инструмента памяти VS.

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

Профилировщик памяти Redgate Ants может показать более подробную информацию (графики Retensoin et c). Вот видео, которое ясно объясняет утечки памяти. https://documentation.red-gate.com/amp10/worked-example/video-tutorials

Можно ли ограничить объем дис c пространства, доступного для программы C#? Мне интересно, могу ли я заставить C# удерживать память в течение более короткого периода времени.

Вы можете позвонить G C. Собрать , чтобы вызвать немедленная сборка мусора после дорогостоящего процесса памяти. Однако это вообще не рекомендуется, если только для этого нет веских причин. Сборщик мусора использует алгоритмы heuristi c для оптимизации своего поведения. Вам не нужно беспокоиться об этом обычно. Одна вещь - УБЕДИТЕСЬ, ЧТО ВЫ УДАЛЯЕТЕ ВСЕ УДАЛЕННЫЕ ВРЕМЕНИ, прежде чем они go выходят за рамки. Это может помочь освободить память с меньшим количеством циклов мусора.

...