出于我们的目的,我们没有使用标准的OSGI jar引用来将jar构建到bundle中。而不是在线升级,我们希望能够在升级期间提供新的和更新的罐子。在启动和停止捆绑包的Activator类中,我们实现自己的URLClassLoader,然后查找子文件夹中的所有jar并提供给URLClassLoader以及OSGI CLassLoader作为父级。这很好,因为现在应用程序的管理员可以简单地将jar添加到类路径并重新启动应用程序(osgi restart,而不是实际关闭jvm)。我们的工作很棒。另外我们的bundle.jar随着时间的推移不会变得很大,因为所有的jar引用都没有包含在bundle jar中。
但是,现在我们可以使用OSGI在同一个JVM中远程重启应用程序。但是,当重新启动时,我们添加的类加载器永远不会收集垃圾。因此,如果您重启应用程序10次,那么它将使Perm Gen内存不足(Java 1.7)。
我们试图模仿WebAppClassLoader在卸载时执行的操作,但这并没有删除引用。
我已经在互联网上搜索了解决方案,并且授予我们在典型的OSGI实现之外进行编码,但是没有办法清除对ClassLoader的引用。重启之后,老实说,不应该有任何参考。
我们使用MAT来分析堆转储,但引用的类列表总是不同。
任何人都知道加载外部库的方法是在OSGI中使用的更好方法吗?
感谢您的任何信息!
答案 0 :(得分:0)
使用Java 8,版本8中没有永久生成。