类加载器之间的共享依赖关系是否会加载两次?

Sma*_*ker 3 java classloader

比方说,我有两个类加载器,x并且y,用于装载ClassXClassY分别,以及它们的依赖关系.应用程序中的其他所有内容都使用默认的类加载器加载.

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

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

现在,我的主要问题是什么,如果只发生xy可以找到ClassZ:如果同时ClassXClassY引用它,将它装入两次(即浪费在PermGen的两倍的空间),或者是Java的足够聪明来检测,它是完全相同的类,加载由两个不同的类加载器,只在内存中保留一个副本?

G_H*_*G_H 5

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

你也可以假设,如果父类加载器ClassXClassY(假设它是相同的)已经加载ClassZ,那么它的两个孩子都将使用它.至少,这是默认方法.类加载器首先将查找委托给其父级,如果找不到它,它将自行尝试.但是,一些自定义加载器可能会覆盖此行为.

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