У меня было приложение C#, работающее в течение последних нескольких недель. Когда я впервые запустил его, он использовал ~ 10000K памяти. С тех пор я проверил, и это занимает около 20000K памяти.Должна ли сбор мусора работать уже сейчас?
Я не знаю .Net сбор мусора очень хорошо, но является ли это признаком того, что у меня определенно есть утечка памяти? Разве GC не должен работать?
Я прочитал в сборщик мусора здесь:
https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx
И они имеют следующие условия, когда GC должен работать:
Система имеет низкую физическую память. (у меня есть более чем 70000K памяти осталось в использовании, так что это не должно быть запущено)
память, которая используется выделенных объектов в управляемой куче превосходит приемлемый порог. Этот порог непрерывно , отрегулированный по мере запуска процесса. (как вы определяете «приемлемый» порог?)
не Должен ли я ожидать, GC, исчерпал в отрезок времени несколько недель?
Наиболее распространенная причина, по которой люди думают, что .NET не собирает мусор, заключается в том, что они неправильно понимают, что диспетчер задач показывает им, и как .NET управляет кучей. Просто потому, что потребление прямой памяти вашей программы уменьшается, это не значит, что .NET отдал память обратно в Windows. Или, может быть, у вас есть утечка памяти. Кто знает? Вы не обеспечили хороший [mcve]. –
Чтобы проверить, есть ли утечка памяти, не используйте диспетчер задач. Вместо этого используйте надлежащий профайлер памяти. Существует один поставляется с Visual Stuidio. – jetstream96
Переход от 10 МБ до 20 МБ без использования сборщика мусора возможен только на машине серверного класса.Это очень низкий объем памяти для типичной программы на C#, с использованием доступной оперативной памяти на компьютере - это лучший способ быстро выполнить код, и CLR делает все возможное, чтобы воспользоваться им. Похоже, ваша программа не дает ему большой шанс. У вас есть только утечка, когда вы можете заставить его постоянно подниматься к ~ 1,5 гигабайтам. Вам нужно настроить порог между ушами :) –