Должен ли я беспокоиться об утечке памяти? - PullRequest
2 голосов
/ 30 декабря 2011

Я новичок в написании служб Windows. Я решил написать тот, который делает исходящие звонки через Twilio. Я использую операторы using, когда использую ресурс, который реализует IDisposable. До сих пор я запускал сервис в общей сложности четыре часа, и вот мое использование памяти:

Старт: 9k

15 мин .: 10k

30 мин .: 13k

1 час: 13k

2 часа: 13k

3 часа: 13k

Через 30 минут это кажется согласованным (между 13 100 и 13 200), но я не уверен, почему ресурсы все еще выделяются после первых 30 минут. Метод OnStart () инициирует 4 таймера и несколько небольших объектов. Строительство моих объектов, конечно, не займет 30 минут. Таймеры просто ждут определенного времени, выполняют запрос, затем ставят в очередь результаты с Twilio и ждут следующего события.

Должен ли я быть обеспокоен утечкой памяти на этом этапе? Это нормально для такого приложения?

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Нет, похоже, вам не нужно беспокоиться об утечке памяти.

На машине с несколькими гигабайтами памяти потребление 13 КБ памяти ... тривиально мало. Если это неуклонно растет и никогда не уменьшается, то у вас есть утечка, в противном случае вы в порядке.


Стоит помнить, что строки в CLR являются инвариантными, поэтому каждый раз, когда вы «меняете» строку, создается новая копия, и память, выделенная для старой версии, помечается как неиспользуемая. Таким образом, большинство программ используют небольшую часть памяти только при обычном повседневном использовании: это нормально, и это только то, о чем нужно беспокоиться в граничных условиях, таких как очень узкие циклы или огромные коллекции или и то, и другое.

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

В некоторых ситуациях для строк (и других объектов) может быть выделена память (и другие ресурсы, такие как дескрипторы файлов), которые не освобождаются после использования, и именно здесь вам необходимо использовать Dispose().

1 голос
/ 30 декабря 2011

Обоснованное предположение может заключаться в том, что платформа все еще выделяет некоторые вещи, когда вы выполняете HTTP-запросы и тому подобное.

Я бы не волновался на этом этапе, но если вы действительно этого хотите, вы всегда можете использовать CLR Profiler или другой профилировщик памяти .NET, чтобы увидеть, что происходит, и если есть о чем беспокоиться .

...