比方说,我有两个类加载器,x并且y,用于装载ClassX和ClassY分别,以及它们的依赖关系.应用程序中的其他所有内容都使用默认的类加载器加载.
现在假设ClassX并ClassY共享一个依赖项,ClassZ.
如果主应用程序也依赖于ClassZ(无论它是否实际加载了类),我的假设是x/ y将根本不会使用/ 来解决这个问题,因为默认的类加载器应该能够找到它.(如果我错了,请纠正我.)
现在,我的主要问题是什么,如果只发生x和y可以找到ClassZ:如果同时ClassX和ClassY引用它,将它装入两次(即浪费在PermGen的两倍的空间),或者是Java的足够聪明来检测,它是完全相同的类,加载由两个不同的类加载器,只在内存中保留一个副本?
他们都有自己的Class实例ClassZ.在基于Java构建的各种技术中保持这样的加载是很重要的,例如Web服务器或Java EE环境可能需要为部署的应用程序维护单独的上下文.
你也可以假设,如果父类加载器ClassX和ClassY(假设它是相同的)已经加载ClassZ,那么它的两个孩子都将使用它.至少,这是默认方法.类加载器首先将查找委托给其父级,如果找不到它,它将自行尝试.但是,一些自定义加载器可能会覆盖此行为.
可以出现复杂的类加载器层次结构.虽然这确实"浪费"了permgen中的一些空间,但尝试共享资源通常比它的价值更麻烦,并且会在某些框架中导致兼容性问题或类加载器泄漏.
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |