出于我们的目的,我们没有使用将jar构建到捆绑包中的标准OSGI jar参考。相反,对于在线升级,我们希望能够在升级期间提供新的和更新的jars。在启动和停止捆绑包的Activator类中,我们实现自己的URLClassLoader,然后在子文件夹中查找所有jar,并将其与OSGI一起提供给URLClassLoader作为父CLassLoader。这很棒,因为现在应用程序的管理员可以简单地将jars添加到类路径并重新启动应用程序(osgi重新启动,而不是实际关闭jvm)。我们让它工作得很好。另外,随着时间的推移,我们的bundle.jar不会变得很大,因为捆绑包jar中并没有包含所有的jar引用。
但是,现在我们可以使用OSGI在同一个JVM中远程重启应用程序。但是,当重启发生时,我们添加的类加载器永远不会被垃圾回收。因此,如果您重新启动应用程序10次,那么Perm Gen将耗尽内存(Java1.7)。
我们试图模仿apache WebAppClassLoader在卸载时所做的事情,但这也没有删除引用。
我已经在互联网上寻找了解决方案,并承认我们是在典型的OSGI实现之外编写代码,然而,没有一种方法可以清除对ClassLoader的引用。在重启之后,老实说不应该有任何引用。
我们已经使用MAT分析了堆转储,但是类的引用列表总是不同的。
谁知道在OSGI中加载外部库更好的方法?
感谢您的任何信息!
发布于 2017-06-05 02:00:07
使用Java 8,在版本8中没有永久的生成。
https://stackoverflow.com/questions/44341830
复制相似问题