java - 为什么需要更多的类加载器?

标签 java jakarta-ee classloader

我知道 java 中类加载器的层次结构是:

1.Bootstrap 类加载器(在 native 代码中)
2. 扩展类加载器(sun.misc.Launcher$ExtClassLoader)
3.系统类加载器(sun.misc.Launcher$AppClassLoader类)
4.自定义类加载器(即app server、ear classloader、war classloader)

我不清楚为什么需要额外的子类加载器。我可以理解在 native 代码之后对“纯 Java”类加载器的需求。
我对可能的原因有一些想法,但有人可以为我提供有关此行为/类加载器层次结构需求的明确解释吗?
一般但也适用于 j2ee。

最佳答案

类加载器可用于提供多种行为,以及保护在同一 VM 中运行的不同 Java 程序免受彼此的影响。我想到了三大类:

  • 类加载器可以以不同方式实现加载类的过程。例如,您可能有一个类加载器从某个服务器检索类的字节码,然后将其安装到 JVM 中,或者您可能有一个实际上是 generates the bytecode on the fly 的类加载器。而不是从文件中读取它。
  • 类加载器可以在单个 JVM 内形成分区,这样不同的代码“树”就可以拥有同名类的不同副本。一个常见的例子是像 Tomcat 这样的 servlet 容器,其中可能安装了多个 war,它们都具有不同版本的库(比如 Apache Commons-Lang)。 OSGi 还使用这种方法来确保每个 bundle 只能访问它特别请求的类,而不能“泄漏”API。
  • 类加载器可用于实现关于何时对实际类本身进行垃圾回收的不同策略。仅使用默认的类加载器可以无限期地保留类,从而导致可怕的 PermGen 错误;使用大量临时类(可能是动态生成的)的应用程序可能希望通过使用一次性类加载器确保在不再需要时释放它们。

关于java - 为什么需要更多的类加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18519515/

相关文章:

java - 如何使用 JdbcTemplate 正确处理此日期字段映射到 Spring Boot 项目中?

mysql - 如何在我的 web 应用程序中模拟垃圾概念?

java - Java-Process 可以删除加载的 JAR 吗?

java - Tomcat Web 应用程序中的单例和类加载器

java - 如何使 Java 中的 XPathFactory newInstance 失败?

java - Spring事务及其与synchronized关键字的交互

java - 无法居中 JButtons

java - 无法在另一台电脑上执行 JAR 文件

java - 使用 JSTL 或 EL 在 JSP 中显示 servlet 错误

jakarta-ee - Java : Insert multiple rows into MySQL