在此链接here

它们描述了使用类加载器时的内存泄漏。现在,此评论:


  仅当没有其他引用时,垃圾回收器才会删除类加载器。所有类均持有对其类加载器的引用,所有对象均具有对其类的引用。结果,如果应用程序被卸载但其对象之一仍被保留(例如,通过缓存或线程局部变量),则垃圾收集器将无法删除基础类加载器!


我有点了解。但是在那部分他们说:


  (例如,通过缓存或线程局部变量)


我是否正确地说,高速缓存是静态引用,而线程局部是非静态线程局部变量。我之所以这样说,是因为所有对线程本地内存泄漏的代码解释都使threadlocal变量成为静态变量。例如,此问题in SO

我对缓存的评论的另一个问题是:当应用程序关闭时,静态变量将被GC处理,为什么这会带来问题?

最佳答案

每个线程(有效地)具有一个WeakHashMap,其中Data是某个对象,该对象指的是Class,Class指的是ClassLoader,ClassLoader指的是它已加载的所有类(例如ThreadLocalHolder),ThreadLocalHolder类具有一个静态保存ThreadLocal,因此WeakHashMap值引用键,这将防止在整个Thread对象消失之前收集键+值。有关更详细的说明和示例,请参见我的this answer

10-05 22:47
查看更多