我梳理了一下,你现在的问题不是在探讨为什么threadLocal在tomcat中造成了内存泄露,而是只考虑类加载器与类的互引用让你觉得它们无法被卸载对吧 "WebAppClalssLoader 被gc的条件必然是没有任何人引用" 这是准确的吗?假设内存中有一对相互引用的对象,但是他们都没有任何其他的对象所引用,难道JVM就无法回收他们吗? 在不同的GC算法里对这种情况应该都是有所处理的,比如标记清除算法等等,尽管有相互引用,但是由于没有从根对象到达它们的路径,所以还是有可能被回收的。这是回答你的问题。 另外,这篇知乎文章的观点我也不是很认同。使用threadLocal时必须注意线程在threadLocal内持有的对象是否能回收。他的情况是认为通过tomcat对web应用进行reload之后就可以不管不顾了,殊不知他的程序根本没有正确地结束所有的线程,进而线程在threadLocal内持有的对象无法被回收,进而导致整个应用无法被回收。他的内存泄露是reload时不能彻底关闭之前的应用导致的