У меня есть настольное приложение WPF, которое загружает из файла очень большой сериализованный объект и выполняет на нем некоторую обработку данных. После завершения пользователь может отбросить эти данные и загрузить другой файл для обработки и т. Д. В качестве меры предосторожности из-за размера создаваемых объектов я сжимаю кучу больших объектов после каждого «запуска», используя: -
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
Для интереса я отображаю использование памяти в окне приложения используя GC.GetTotalMemory(false)
. После загрузки и обработки первого файла использование памяти увеличивается до 2,2 ГБ (да, данные настолько велики). Если затем я снова обработаю тот же файл, использование памяти увеличится до 4,4 ГБ, что предполагает, что предыдущие данные не освобождаются / не удаляются (хотя я на 99,99% уверен, что так и должно быть).
В любом случае, вот странная вещь. Если я запускаю приложение с использованием профилировщика производительности VS2019 в режиме «использования памяти», я вижу, что его график увеличивается до 2,2 ГБ при первом запуске обработки, а затем до 4,4 ГБ во втором. Но , если я сделаю снимок, использование памяти в этот момент упадет до 2,2 ГБ на диаграмме профилировщика и значения, отображаемого в моем приложении.
Если я не использую профилировщик производительности (или не делаю, но не делаю снимок), отображаемое в моем приложении использование памяти остается на уровне 4,4 ГБ и никогда не падает. Почему профилировщик (или, более конкретно, создание снимка) влияет на использование памяти?
