上次观察我的应用内存占用很高,老年代的内存每次GC下去的都不多,虽然没有出现严重的FullGc,但是每次GC后老年代还会保留70%的内存,感觉不合常理。
dump了一次堆后发现,有很多内存被ThreadLocal引用着,这是框架里面的,看了下框架,里面有一段代码:private static ThreadLocal xxx = new ThreadLocal 做了一个静态的,而且只有set没有remove。
但是ThreadLocal是被线程绑定的,而且只有一个TL对象的话,每次set其实只会保留一个值,也不至于一直囤积。
ThreadLocal 做成静态的这么用真的没问题吗?
很高...不多...这些术语大模糊了, 最好有具体的数字. 包括Java的启动内存参数是什么?
内存使用和场景有关好, 老年代之所以是老代就是因为生存期长,不应每次都被回收才对.
ThreadLocal一般生命周期是等同与Thread的. 关键是里面引用了哪些数据,这些数据是不是也应该有同样长的生命周期, 如果是的话,就认为是合理的使用.
同时要看是哪些Thread持有的ThreadLocal, 是main,还是deamon还是http?