2015-03-10 3 views
6

Я изучал возможность того, что одно из моих приложений может иметь утечку памяти, поэтому начал играть с некоторыми очень базовыми образцами кода. Один из них, с которым я закончил, со временем значительно увеличился с точки зрения количества ручек (> 3000). Это очень простое консольное приложение с кодом следующим образом:C# Handles Count

public static void Main(string[] args) 
{ 
    using (SqlConnection sqlConnection = new SqlConnection()) 
    { 
    } 

    Console.ReadLine(); 
} 

Достав вызов SqlConnection удаляет любое увеличение Handle, таким образом, я предполагаю, что это имеет какое-то отношение пула соединений. Но поскольку это только запускается один раз, прежде чем в основном идти в ожидании ввода, почему счет Handle продолжает расти?

Спасибо.

+1

Как вы проверяете количество ручек? – tia

+0

Я использую Task Manger, а также Process Explorer (sysinternals). –

+0

a Утечка памяти возникает, когда программа резервирует память для собственного использования и не освобождается при завершении работы или превышает ее собственную квоту памяти и записывает ее в блок, используемый другим процессом, операционная система должна предотвращать вторую и структура предотвращает первый так, если вы не используете маршал для распределения памяти вручную и не очищаете последующие утечки памяти, вероятно, не будет проблемой. – MikeT

ответ

4

Если вы работаете его на .NET 4.0, это может быть в случае

https://connect.microsoft.com/VisualStudio/feedback/details/691725/sqlconnection-handle-leak-net-4-0

+0

Спасибо tia. Это, похоже, проблема. Я изменил с Framework 4.5.1 до 3.5 в проекте, перестроил, и теперь счетчик ручек остается постоянным. Так что, перейдя по выше размещенному Microsoft, он просто медленно собирается из пула потоков, и счет Handle в конечном итоге снизится, когда достаточная активность в приложении заставит gc взорваться. Все еще кажется странным поведением, чтобы внедрить в .Net 4.0 ... может быть, с исполнением или что-то еще ... Ну, по крайней мере, это очищает то, что я вижу. Приветствия. –

0

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

IIRC кэш объекта по умолчанию около 4000 объектов.

вы должны помнить, что только потому, что ваши единственное создание и продажа одного объекта не означает, что все работы рамы делают

+0

Спасибо за ответ. Я понимаю, что структура делает намного больше в фоновом режиме. Но без этого SqlConnection Используя вызов создания, счетчик Handle приложения остается постоянным. Так что действительно пытаюсь понять, что именно этот звонок запускается или инициируется, что приводит к этому поведению счетчика ручек. –

+0

, если вы посмотрите на класс соединений SQL, вы увидите, что он содержит другие классы, такие как SqlConnection, DbProviderFactory, IContainer. ISite, SecureString., ConnectionState и т. Д., Так как вы правильно используете команду use для утилизации объекта соединения после использования, тогда он будет подхвачен очередным запуском GC, поэтому утечки не должно быть. вы van заставляете GC работать с GC.Collect() – MikeT

+0

Привет, MikeT, еще раз спасибо за ответ. Я пошел с tia, указав разницу в поведении 3.5 по сравнению с 4.0 и выше. Но да, возможно, заставив ГК свести его. Хотя я знаю, что это то, что обычно не рекомендуется. Может просто вернуться к 3.5. –