2016-08-02 1 views
-1

У меня было приложение C#, работающее в течение последних нескольких недель. Когда я впервые запустил его, он использовал ~ 10000K памяти. С тех пор я проверил, и это занимает около 20000K памяти.Должна ли сбор мусора работать уже сейчас?

Я не знаю .Net сбор мусора очень хорошо, но является ли это признаком того, что у меня определенно есть утечка памяти? Разве GC не должен работать?

Я прочитал в сборщик мусора здесь:

https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx

И они имеют следующие условия, когда GC должен работать:

  • Система имеет низкую физическую память. (у меня есть более чем 70000K памяти осталось в использовании, так что это не должно быть запущено)

  • память, которая используется выделенных объектов в управляемой куче превосходит приемлемый порог. Этот порог непрерывно , отрегулированный по мере запуска процесса. (как вы определяете «приемлемый» порог?)

не Должен ли я ожидать, GC, исчерпал в отрезок времени несколько недель?

+1

Наиболее распространенная причина, по которой люди думают, что .NET не собирает мусор, заключается в том, что они неправильно понимают, что диспетчер задач показывает им, и как .NET управляет кучей. Просто потому, что потребление прямой памяти вашей программы уменьшается, это не значит, что .NET отдал память обратно в Windows. Или, может быть, у вас есть утечка памяти. Кто знает? Вы не обеспечили хороший [mcve]. –

+0

Чтобы проверить, есть ли утечка памяти, не используйте диспетчер задач. Вместо этого используйте надлежащий профайлер памяти. Существует один поставляется с Visual Stuidio. – jetstream96

+0

Переход от 10 МБ до 20 МБ без использования сборщика мусора возможен только на машине серверного класса.Это очень низкий объем памяти для типичной программы на C#, с использованием доступной оперативной памяти на компьютере - это лучший способ быстро выполнить код, и CLR делает все возможное, чтобы воспользоваться им. Похоже, ваша программа не дает ему большой шанс. У вас есть только утечка, когда вы можете заставить его постоянно подниматься к ~ 1,5 гигабайтам. Вам нужно настроить порог между ушами :) –

ответ

0

Должен ли я ожидать, что GC будет работать в течение нескольких недель?

Нет, вы не должны ожидать, что GC.Collect произойдет своевременно.

Сбор мусора происходит тогда, когда одно из следующих условий является истинным :

  • Система имеет низкую физическую память.
  • Память, которая используется выделенными объектами в управляемой куче, превосходит допустимый порог. Этот порог непрерывно
    отрегулирован по мере запуска процесса.
  • Вызывается метод GC.Collect. Почти во всех случаях вам не нужно вызывать этот метод, потому что сборщик мусора постоянно работает . Этот метод в основном используется для уникальных ситуаций и тестирования.

Прочитайте это для более fundamental деталей.