gpt4 book ai didi

java - Custom ClassLoader会导致内存泄漏吗?

转载 作者:行者123 更新时间:2023-11-30 06:23:47 43 4
gpt4 key购买 nike

ClassLoader 存储在永久代内存中。正如 Java Memory Management in the Java HotSpot™ Virtual Machine 白皮书所述,永久代内存肯定会被垃圾回收。那么,自定义 Classloader 是否仍然会导致内存泄漏?如果是,那为什么会发生?

更新

在@Marko Topolnik 和@Prunge 的帮助下,我明白了我的疑问。以下几点是关于类加载器和内存泄漏的:

  1. 自定义 ClassLoader 不存储在 Perm 生成中。
  2. 自定义 ClassLoader 如果 ClassLoder 超出范围,则可能会导致内存泄漏,但无论我们是否设置 ClassLoader 对象为 null
  3. 如果我们不需要给定的 ClassLoader 对象,那么我们应该确保对从加载的类开发的对象的所有引用都应该是 null
  4. 如果 ClassLoader 加载的任何类不符合 GC 的条件,则 ClassLoader 将不会被 GCed

最佳答案

自定义类加载器本身不会导致内存泄漏。如果他们加载的类没有被正确使用,那么就会发生泄漏。

类和类加载器可以正常进行垃圾回收——这可以通过-Xnoclassgc 命令行选项关闭,但用户必须明确地执行此操作。类加载器引用了它们的所有类,因此类加载器只有在它们的所有类都不再被引用时才能被垃圾回收。

当应用程序中仍然引用从自定义类加载器加载的类或这些类的实例时,可能会发生泄漏。

一个常见的例子是 Java EE 网络容器,例如 Tomcat:

让我们假设容器中的每个 webapp 都有自己的类加载器。当一个 web 应用程序被卸载时,容器会丢弃该应用程序并且所有的类(包括已编译的 JSP)都不应再被引用,并且这些类和类加载器迟早会被垃圾收集清除。但是 webapp 可能已经在 DriverManager 中注册了一个数据库驱动程序,或者使用了一些 bean introspection (很可能通过一个流行的第三方库间接地进行反射)保持bean元数据缓存,因此来自webapp类加载器的类在webapp被取消部署后继续存在,仍然被未被webapp类加载器加载的其他对象强烈引用。

Tomcat 有一个 page describing a few of the possible leak scenarios以及它如何围绕它们运作。

但自定义类加载器如果编写正确则不会导致泄漏。

关于java - Custom ClassLoader会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17898316/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com