Утечка памяти в C # при запуске в качестве службы Windows, а не в качестве консольного приложения - PullRequest
0 голосов
/ 14 сентября 2018

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

Используя ANTS Memory Profiler, я увидел, что утечка памяти удерживалась корнем GC очереди финализатора.Поэтому возникает вопрос: почему объекты застряли в очереди финализатора, когда программа запускалась как служба Windows?

Исходный вопрос

Я занимаюсь разработкой службы Windows вC #.Периодически собирает данные с сетевых устройств.Целевая среда - 4.6.

Я использую TPL ActionBlock для параллельной отправки запроса.

Моя проблема: Если я запускаю приложение как обычное консольное приложение, использование памяти остается нормальным.(100 МБ) В отладчике видно, что сборщик мусора запускается регулярно.

Когда приложение запускается в сеансе 0 в качестве службы Windows, использование памяти возрастает до нехватки памяти.(6 ГБ) Присоединение отладчика Visual Studio к службе Windows - это показывает, что сборщик мусора происходит иногда, но не так часто, как в обычной консоли.

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

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 24 сентября 2018

Использование ANTS Memory Profiler Я обнаружил, что утечка памяти удерживалась корнем GC очереди финализатора.

Этот вопрос привел меня к решению: Как найти причину зависания очереди финализатора?

Я преобразовал свое приложение WinForms в консольное приложение, а затем в службу Windows.Я оставил замечание [STAThread] перед методом Main.Это приводило к зависанию очереди финализатора при запуске программы в качестве службы Windows.

...