gpt4 book ai didi

java - 类加载器之间的共享依赖项是否会加载两次?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:52 24 4
gpt4 key购买 nike

假设我有两个类加载器,xy,分别用于加载 ClassXClassY ,以及它们的依赖关系。应用程序中的所有其他内容都是使用默认类加载器加载的。

现在假设 ClassXClassY 共享一个依赖项 ClassZ

如果主应用程序也依赖于 ClassZ(无论它是否已经实际加载该类),我的假设是 x/y 根本不会被用来解决这个问题,因为默认的类加载器应该能够找到它。 (如有错误请指正。)

现在,我的主要问题是如果只有 xy 可以找到 ClassZ 会发生什么:如果 ClassX > 和 ClassY 引用它,它会被加载两次(即在 PermGen 中浪费两倍的空间)还是 Java 足够聪明地检测到它是完全相同的类,由两个不同的类加载器加载,并且只是在内存中保留一份副本?

最佳答案

它们都有自己的 ClassZClass 实例。在基于 Java 构建的各种技术中保持这种加载独立很重要,例如可能需要为部署的应用程序维护单独上下文的网络服务器或 Java EE 环境。

您的假设也是正确的,如果 ClassXClassY 的父类加载器(假设它们相同)加载了 ClassZ ,那么它的两个 child 都会使用那个。至少,这是默认方法。类加载器首先将查找委托(delegate)给其父级,如果找不到它,它将自行尝试。不过,一些自定义加载器可能会覆盖此行为。

可能会出现复杂的类加载器层次结构。虽然这确实“浪费”了 permgen 中的一些空间,但尝试共享资源往往比它的值(value)更麻烦,并且会在某些框架中导致兼容性问题或类加载器泄漏。

关于java - 类加载器之间的共享依赖项是否会加载两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21162609/

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