ThreadLocal对象使用的问题

上次观察我的应用内存占用很高,老年代的内存每次GC下去的都不多,虽然没有出现严重的FullGc,但是每次GC后老年代还会保留70%的内存,感觉不合常理。

dump了一次堆后发现,有很多内存被ThreadLocal引用着,这是框架里面的,看了下框架,里面有一段代码:private static ThreadLocal xxx = new ThreadLocal 做了一个静态的,而且只有set没有remove。

但是ThreadLocal是被线程绑定的,而且只有一个TL对象的话,每次set其实只会保留一个值,也不至于一直囤积。

ThreadLocal 做成静态的这么用真的没问题吗?

阅读 1.9k
2 个回答

很高...不多...这些术语大模糊了, 最好有具体的数字. 包括Java的启动内存参数是什么?

内存使用和场景有关好, 老年代之所以是老代就是因为生存期长,不应每次都被回收才对.

ThreadLocal一般生命周期是等同与Thread的. 关键是里面引用了哪些数据,这些数据是不是也应该有同样长的生命周期, 如果是的话,就认为是合理的使用.
同时要看是哪些Thread持有的ThreadLocal, 是main,还是deamon还是http?

threadlocal采用的就是空间换时间,所以内存相对会大一点。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题