почему память не освобождается в постоянно работающей запланированной консоли на основе ядра .Net CORE 2.2 + EF - PullRequest
0 голосов
/ 10 октября 2019

У меня есть консольное приложение .Net core 2.2, которое использует внутреннее ядро ​​EF для вызовов в БД. Он работает как запланированный сервис, используя topshelf и quartz.net. Я наблюдаю, как использование памяти этой консоли продолжает увеличиваться до тех пор, пока не достигнет 90% ОЗУ сервера, я не знаю, может ли она продолжать занимать больше ОЗУ, чем когда оно достигает этого запаса, я обычно выключаю его и перезапускаю снова.

Я не могу поделиться кодом здесь, так как проект обширный и не могу сузить, что может вызвать это. Хотя я проверил код достаточно, и в коде нет ничего, что могло бы сделатьприложение продолжает удерживать старые памяти / объекты.

Я также проверил файл дампа, используя один из инструментов анализа дампа, и выяснил, что около 50% памяти используется строковыми значениями (которые быстро теряют объем, но являются большими данными)и для отдыха;большая часть памяти используется ядром EF (если быть точным, измените трекер). Я делаю большое создание json в цикле для списка строк БД, но все это должно быть когда-нибудь освобождено / собрано, поскольку все они являются частью списка управляемых объектов, и цикл быстро теряет свою область видимости.

Кто-нибудь сталкивался с подобной проблемой, когда в запланированном приложении .net core 2.2 приложение GC не запускается или память вообще не освобождается, если оставить ее для работы на несколько дней, учитывая, что код выглядит нормально для утечки памяти.

1 Ответ

1 голос
/ 31 октября 2019

Дважды проверьте все, касаясь Quartz.net. Quartz.net может зависать от ссылок, которые, по вашему мнению, должны быть GCed.

Если вы используете правильный трекер памяти, такой как dotMemory, поможет вам точно определить, какие объекты не освобождаются.

...