Память не освобождается с помощью log4net - PullRequest
0 голосов
/ 03 октября 2018

Я использую log4nets MemoryAppender для регистрации отладочных сообщений и по какой-то причине даже при очистке событий память не освобождается.Это большая проблема даже при запуске некоторого примера кода, так как использование памяти увеличивается до 1 ГБ +.

Я пытался заставить GC собирать, и это снижает использование на ~ 2 МБ после очистки событий, но затемэто поднимается снова позже.Очистка событий и создание нового объекта appender совсем не помогают.При проверке окна диагностики я получаю изображение ниже.Кто-нибудь знает, что это за утечка?Почему он просто продолжает заполняться?

Создание приложения:

appender = new MemoryAppender();
LoggerMatchFilter f = new LoggerMatchFilter{ LoggerToMatch = "MemoryLogger" };
appender.AddFilter(f);
appender.ActivateOptions();
GetRootLogger().AddAppender(appender);
Logger logger = (Logger)log.Logger;
logger.AddAppender(appender);

Очистка событий (выполненных в переопределенном методе Append):

if(m_eventsList.Count > 200)
{
   m_eventsList.Clear();
   GC.Collect();
   GC.WaitForPendingFinalizers();
}

Снимок диагностики Diagnostics Snapshot

1 Ответ

0 голосов
/ 03 октября 2018

Обращение к Google приводит к статье , где обсуждается аналогичная проблема, касающаяся log4j .

. Там проблема вызвана созданием множества регистраторов с разными именами.log4j хранит все эти регистраторы в Hashtable, поэтому они не будут собирать мусор.

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

Так что, если вы создадитемножество новых регистраторов в вашем приложении, это может быть проблемой.

...