什么是类加载器泄漏?

sco*_*les 5 java memory-leaks memory-management classloader

我在google中看到了如何解决Classloader泄漏的方法,但是没有地方解释什么是Classloader泄漏?

说我加载一个对象,Person person = new Person()然后Person类将由class loader加载.Person类对象将永远保留在metaspace中(在Java 8之前它将保留在permgen中),即使不使用Person对象(不是person类对象)任何可以申请的地方。是否将其视为内存泄漏?

ezt*_*tam 6

在应用服务器内重新加载或重新部署应用程序时可能会发生类加载器泄漏,但不会在重新启动整个服务器时发生。每次在应用服务器(例如 Tomcat)中重新启动应用程序时,都会创建一个新的类加载器以加载应用程序的类。同时不再使用旧的类加载器。由于对旧类加载器的所有引用都已删除,因此现在应该可用于垃圾收集。如果并非所有对旧类加载器的引用都已删除,则无法对其进行垃圾收集,并且您会出现类加载器泄漏。

类加载器泄漏的一个很常见的原因是在一个应用程序服务器内的多个应用程序之间使用共享库。例如,如果这样的库持有对 Web 应用程序类加载器的静态引用,则该类加载器不能被垃圾收集,即使在应用程序停止之后也是如此。


Ing*_*gel 0

如果不创建类加载器,就不会出现类加载器泄漏。

如果您随着时间的推移创建多个类加载器并期望旧类加载器中的所有类都被垃圾收集,则会发生类加载器泄漏。这种最常见的场景是在容器中重新加载 Web 应用程序。

类加载器的垃圾收集很棘手,因为即使您在代码中没有保存任何引用,例如在使用 ThreadLocals 时,仍然可以通过一些非明显的方式引用实例。