gpt4 book ai didi

java - Apache 的 ContextMap 是否需要显式清理?

转载 作者:太空宇宙 更新时间:2023-11-04 12:10:51 26 4
gpt4 key购买 nike

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

removeStack()

Each thread that created a diagnostic context by calling push(java.lang.String) should call this method before exiting. Otherwise, the memory used by the thread cannot be reclaimed by the VM.

If you never call it, then your application is sure to run out of memory.

让我害怕的是,即使我完整地阅读了类描述,整个方法摘要部分,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 版本的保证感兴趣。

最佳答案

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

堆栈问题有点不同。如果您在请求开始时将项目推送到堆栈上,然后不将它们弹出,那么当下一个请求到来时,它们仍然会在那里,这可能会将新值推送到堆栈上,但也不会弹出。

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

关于java - Apache 的 ContextMap 是否需要显式清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39881830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com