使用Log4net无法释放内存

时间:2018-10-03 11:25:26

标签: c# .net log4net log4net-appender

我正在使用log4nets MemoryAppender记录调试消息,并且由于某些原因,即使清除事件也无法释放内存。即使运行一些示例代码,这也是一个大问题,因为内存使用量会飙升至1GB +。

我尝试过强制GC进行收集,并且在清除事件后确实将使用量降低了约2MB,但随后又再次升高了。清除事件并创建新的appender对象完全没有帮助。当检查诊断窗口时,我得到以下图像。有人知道泄漏可能是什么吗?为什么它会不断填满?

创建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 :(得分:1)

向Google提出了一个article问题,其中讨论了关于 log4j 的类似问题。

那里,问题是由创建许多具有不同名称的记录器引起的。 log4j将所有这些记录器保存在Hashtable中,因此不会被垃圾收集。

推荐的解决方案是重用记录器对象,而不是创建新的记录器对象。

因此,如果您在应用中创建了很多新的记录器,则可能是问题所在。