【问题标题】:Spring ThreadLocalTargetSource - does this have memory leaks?Spring ThreadLocalTargetSource - 这有内存泄漏吗?
【发布时间】:2013-11-27 15:15:39
【问题描述】:

我打算使用 Spring 的 ThreadLocalTargetSource 来访问我的 Web 应用程序和 Web 服务应用程序的用户上下文。

我已经在网上浏览了一段时间,我看到的只是关于内存泄漏的可怕结果。我看到ThreadLocalTargetSource 实现已经有一个destroy 方法来清理和取消threadlocal 对象。我相信这一切都很好。那么为什么当 Spring 以正确的方式处理它时,我们会出现内存泄漏呢?有什么我们需要明确地为此做的吗?

【问题讨论】:

  • 你能发布一些你提到的可怕结果的链接吗?
  • 感谢 Duncan,下面的这篇文章提到了 ThreadLocal 的弊端。由于 spring 的 threadlocaltarget 是在 threadlocal 上构建的,我怀疑这是否会导致我的项目出现问题?比迟到更安全...blog.igorminar.com/2009/03/…

标签: java spring memory-leaks thread-local


【解决方案1】:

使用伤害不大,但要小心一点。

正如 API 文档所建议的那样,每个线程都将拥有其目标副本,并且在应用程序实际关闭之前,内存中的线程绑定对象可能很少。

API 语句只是建议必须格外小心地使用此类,尽管 string 提供了 destroy 方法使对象可用于 GC。不然很好用。

如果要使用 ThreadLocal,请为每个请求周期取消设置对象。

请参考以下博客链接和 API 文档

http://tigrou.nl/2009/05/09/springs-threadlocaltargetsource/

http://docs.spring.io/spring/docs/2.0.x/api/org/springframework/aop/target/ThreadLocalTargetSource.html

【讨论】:

  • 感谢 Abhijith,您所说的 使对象可用于 GC 是什么意思,SPRING 正是在destroy 方法中这样做的,不是吗?请让我知道这一点,可能是我在这里误解了你。
  • 这是我的代码,(这一切都很好还是我们需要包含其他内容?)ThreadLocalTargetSource t= (ThreadLocalTargetSource)appCtx.getBean("threadLocal"); ReqContext reqContext = (ReqContext)target.getTarget(); UserContext usrholder = reqContext.getUserContext(); usrholder.setAppId("Tset");
  • 我的意思是一样的,Spring 使线程池及其关联对象无效,并且无效对象被 GC 清除。
  • 那么,我们可以不用任何自定义处理就使用上面的代码吗?
  • 如果我需要监视线程本地对象,可以使用一个快速查询标记为这个。有没有办法通过 MAT 工具(Eclipse - Memory Analyzer tool)来做到这一点?
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多