我知道静态字段会导致内存泄漏,因为它们不会被 GC。
但是当有一个Web应用部署在一个容器中(比如Tomcat)时,每个应用都有自己的ClassLoader,可以取消部署。
我的问题是,垃圾收集器是否声明将要卸载的类的静态成员引用的对象?
最简单的情况是单例(通过引用self的静态变量实现),如果取消部署应用程序,它会被GC吗?
我知道静态字段会导致内存泄漏,因为它们不会被 GC。
但是当有一个Web应用部署在一个容器中(比如Tomcat)时,每个应用都有自己的ClassLoader,可以取消部署。
我的问题是,垃圾收集器是否声明将要卸载的类的静态成员引用的对象?
最简单的情况是单例(通过引用self的静态变量实现),如果取消部署应用程序,它会被GC吗?
这可能会回答您的问题:
当应用程序停止时,Tomcat(甚至在 6.0.24 之前)会使 WebAppClassLoader 加载的类的所有静态类变量的值无效。在某些情况下,它可能会修复类加载器泄漏(例如,由于自定义 ThreadLocal 类,见上文),但即使我们仍然存在泄漏,它也可能会减少丢失的内存量
你可以在这里阅读更多
干杯!!