Наблюдение за использованием виртуальных байтов моей программы во время ее работы показало, что при выполнении каких-то операций использование виртуальных байтов увеличивается примерно на 1 ГБ примерно за 5 минут.
Программа имеет дело с сокетами tcp и высокой пропускной способностью передачи данных между ними (~ 800 Мбит / с).
Загрузка файла дампа программы в windbg показала, что причина очень высокого и быстрого использования памяти - около 1 ГБ «свободных» объектов.
Действительно, когда я вызываю сборщик мусора (gen 0, 1 и 2) с экрана консоли программы (после перехода в это состояние), он освобождает около 1 ГБ памяти.
Я пытаюсь понять, что это за свободные объекты и почему они не собираются сборщиком мусора автоматически.
Редактировать: Одно из предложений заключалось в том, что я могу создавать объекты в куче больших объектов, и они становятся фрагментированными, но это не тот случай, так как я видел, что все "свободные" объекты находятся в Gen 2 Heap.
Другое предположение заключалось в том, что, возможно, «Куча 2-го поколения» фрагментируется из-за закрепленных объектов, но если бы это было так, GC.Collect не решит проблему, но на самом деле это так, поэтому я считаю, что это не так. *
Что я подозреваю из беседы с Полом, так это то, что память освобождается, но по какой-то причине возвращается в ОС редко или только когда я вручную вызываю GC.Collect.