2017-06-03 61 views
0

对于我们的目的,我们没有与构建罐子成捆的标准OSGI罐子参考去。而不是在线升级,我们希望能够在升级期间提供新的和更新的罐子。在我们的启动和停止包的Activator类中,我们实现自己的URLClassLoader,然后查找子文件夹中的所有jar,并将OSGI CLassLoader作为父级提供给URLClassLoader。这很棒,因为现在应用程序的管理员可以简单地将jar添加到类路径并重新启动应用程序(osgi restart,而不是实际关闭jvm)。我们做得很好。加上我们的bundle.jar并没有随着时间的推移而变得庞大,因为所有的jar引用都不包含在bundle jar中。OSGI使用自定义类装载器烫发根问题

然而,现在我们必须使用OSGi在同一个JVM内做远程重新启动应用程序的能力。但是,当重启发生时,我们添加的类加载器从不会被垃圾收集。所以如果你重新启动应用程序10次,那么它会让Perm Gen内存不足(Java 1.7)。

我们试图模仿做什么阿帕奇WebAppClassLoader上卸载但这并不要么删除引用。

我已经走遍了解决方案,互联网,这并授予我们的编码典型的OSGi实现然而外面是不是有办法清除的类加载器的引用。重新启动后,诚实地不应该有任何引用。

我们已经使用MAT分析堆转储,但类的引用列表始终是不同的。

任何人都知道的一种方式来加载外部库OSGI内使用更好的方法?

感谢您的任何信息!

+0

没有永久的一代所以我们尝试使用URLClassLoader的删除,只是完全依靠OSGI来管理类加载。然后,我们通过多次启动和停止bundle来测试这一点,现在不是通过URLClassloader引用所有的类,BundleWiringImpl $ BundleClassLoaderJava5仍然显示每次启动和停止bundle时的引用。 – Dravenj

+1

类加载器只能获取垃圾回收,如果其所有类都无法访问,这意味着这些类的所有实例都无法访问。如果你有泄漏,这并不重要,你如何改变类加载器结构,你只能通过识别泄漏并修复它来摆脱它。 – Holger

回答

0

使用的Java 8中,在版本8

+0

我们遇到了与Java 8相同的问题。生成内存不足需要花费更长的时间,因为元数据空间是在Java 8的堆中定义的。 – Dravenj