我正在使用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();
}
答案 0 :(得分:1)
向Google提出了一个article问题,其中讨论了关于 log4j 的类似问题。
那里,问题是由创建许多具有不同名称的记录器引起的。
log4j将所有这些记录器保存在Hashtable
中,因此不会被垃圾收集。
推荐的解决方案是重用记录器对象,而不是创建新的记录器对象。
因此,如果您在应用中创建了很多新的记录器,则可能是问题所在。