Закрытие некоторых экземпляров приложения увеличивает кучу сбора мусора Gen-2? - PullRequest
0 голосов
/ 13 мая 2010

Мы находимся в процессе отладки некоторых проблем с памятью. Мы смотрели 5 экземпляров одного и того же приложения. Мы остановились 3. Размер кучи Gen2 изменился с 5 до почти 10 м, а размеры кучи Gen0 и Gen1 изменились незначительно.

Это полная противоположность того, что я ожидал. Я ожидал, что он уменьшится в размере, и никогда не ожидал, что он увеличится.

Что здесь происходит?

Подробнее: Это консольные приложения, один и тот же физический .exe, разные командные строки, которые выполняют простую работу «чтение файла, вставка в базу данных» (или наоборот).

Мы столкнулись с проблемами памяти и не смогли найти ее, поэтому в отчаянии добавляли GC.Collect после каждого запуска пакета. Выполнение операции облегчило использование памяти, но не дает понять, в чем заключается основная проблема.

@S.Skov, размеры кучи GC одинаковы для каждого экземпляра. При закрытии некоторых приложений каждое открытое приложение имело одинаковые размеры кучи. Это заставляет нас действовать в предположении, что GC был распространен среди всех экземпляров одной и той же программы. Мы используем Process Explorer из sysinternals для измерения размера кучи.

tl; dr версия: Использование памяти вышло из-под контроля. GC.Collect () «исправляет» симптом, но не проблему. Кроме того, размеры кучи GC всегда одинаковы для всех экземпляров одного и того же приложения.

извинения: я также, возможно, плохо справляюсь с тем, чтобы эффективно транслировать обсуждения нашей команды и махать рукой на что-то значимое в Интернете.

1 Ответ

1 голос
/ 13 мая 2010

Вы уверены, что у вас действительно есть проблема с памятью - то есть вы сталкиваетесь с ошибками памяти или другими «утечками»?

Если GC.Collect () исправляет проблему с памятью, то у вас нет проблем. Сбор мусора происходит только тогда, когда в этом есть необходимость. Обычно это означает, что Gen0 и Gen1 будут собираться много (так как эти области малы по сравнению с Gen2 и LOH), но Gen2 и LOH почти никогда не будут GCed, если вы не нажмете это, или система не окажет давление на приложение. В зависимости от того, что именно вы выделяете, вы также можете увидеть некоторые полные сборки мусора, которые сжимают область кучи различного поколения, но на самом деле не освобождают память.

По своему замыслу .NET-приложение сожрет всю память, которую оно может получить, его жирные руки, и только когда система скажет, чтобы оно остановилось и освободило часть, оно сделает это.

...