Apache的ContextMap是否需要明确清理?

时间:2016-10-05 19:06:22

标签: java memory log4j2

当我在ThreadContext文档中浏览时,我注意到了这个gem:

removeStack()

  

通过调用push(java.lang.String)创建诊断上下文的每个线程都应该在退出之前调用此方法。否则,VM无法回收线程使用的内存。

     

如果您从未打过电话,那么您的应用程序肯定会耗尽内存。

令我害怕的是,即使我完全阅读了课程说明,整个Method Summary部分,ThreadContext.clearStack() Method DetailsThreadContext.push(java.lang.String) Method Details;我从来没有见过这种(显然非常必要)方法的参考。

我没有碰巧使用ThreadContext.push(java.lang.String),只有ThreadContext.put(java.lang.String, java.lang.String),所以我这意味着我对记忆的关注是明确的问题,但我想确定。

我是否有任何与ThreadContextMap有关的事情,以确保能够回收线程的内存,例如clearMap(),clearAll()或其他形式的删除?

经验测试可能会告诉我,在我的系统环境中,我的测试用例中是否存在内存泄漏,但我对所有适用的Java版本的保证感兴趣。< / p>

1 个答案:

答案 0 :(得分:0)

ThreadContextMap和Stack在ThreadLocal变量中维护。在servlet环境(例如Tomcat)中,如果您没有清除Map中的项目,那么即使它们不适用于该请求,下一个请求仍将具有这些值。因此,在这样的环境中,您肯定希望在每个请求结束时清除Map。

堆栈问题有点不同。如果你在请求开始时在堆栈上推送项目然后不要将它们弹出,那么当下一个请求进入时它们仍然会存在,这可能会推动堆栈上的新值也不会被弹出关闭。

您是否遇到问题只取决于您正在创建的应用程序类型。如果您有像Tomcat那样的线程池,那么您必须了解ThreadLocals在该环境中的行为。