当我在ThreadContext文档中浏览时,我注意到了这个gem:
通过调用push(java.lang.String)创建诊断上下文的每个线程都应该在退出之前调用此方法。否则,VM无法回收线程使用的内存。
如果您从未打过电话,那么您的应用程序肯定会耗尽内存。
令我害怕的是,即使我完全阅读了课程说明,整个Method Summary
部分,ThreadContext.clearStack() Method Details和ThreadContext.push(java.lang.String) Method Details;我从来没有见过这种(显然非常必要)方法的参考。
我没有碰巧使用ThreadContext.push(java.lang.String),只有ThreadContext.put(java.lang.String, java.lang.String),所以我想这意味着我对记忆的关注是明确的问题,但我想确定。
我是否有任何与ThreadContextMap有关的事情,以确保能够回收线程的内存,例如clearMap(),clearAll()或其他形式的删除?
经验测试可能会告诉我,在我的系统环境中,我的测试用例中是否存在内存泄漏,但我对所有适用的Java版本的保证感兴趣。< / p>
答案 0 :(得分:0)
ThreadContextMap和Stack在ThreadLocal变量中维护。在servlet环境(例如Tomcat)中,如果您没有清除Map中的项目,那么即使它们不适用于该请求,下一个请求仍将具有这些值。因此,在这样的环境中,您肯定希望在每个请求结束时清除Map。
堆栈问题有点不同。如果你在请求开始时在堆栈上推送项目然后不要将它们弹出,那么当下一个请求进入时它们仍然会存在,这可能会推动堆栈上的新值也不会被弹出关闭。
您是否遇到问题只取决于您正在创建的应用程序类型。如果您有像Tomcat那样的线程池,那么您必须了解ThreadLocals在该环境中的行为。