OSGI涉及的管理费用

OSGI涉及的管理费用,osgi,overhead,Osgi,Overhead,OSGI是当今的流行语。它具有松耦合、可重用等优点。但我想知道,在我的项目中,OSGI是否涉及到任何开销。它是否影响速度或任何其他类型的开销。请帮忙 谢谢没有真正的开销。OSGi设计用于内存非常有限的环境,它实际上可以提高执行速度,因为搜索每个加载请求的类空间更小 对于一个天真的开发人员来说,总是有可能通过做一些愚蠢的事情来破坏性能,但任何环境都是如此。在一个典型的OSGi环境中,您将拥有捆绑类加载器和OSGi服务,您可能会怀疑它们会影响性能。bundle类加载器只看到较小的类空间,因此它不应该

OSGI是当今的流行语。它具有松耦合、可重用等优点。但我想知道,在我的项目中,OSGI是否涉及到任何开销。它是否影响速度或任何其他类型的开销。请帮忙


谢谢

没有真正的开销。OSGi设计用于内存非常有限的环境,它实际上可以提高执行速度,因为搜索每个加载请求的类空间更小


对于一个天真的开发人员来说,总是有可能通过做一些愚蠢的事情来破坏性能,但任何环境都是如此。

在一个典型的OSGi环境中,您将拥有捆绑类加载器和OSGi服务,您可能会怀疑它们会影响性能。bundle类加载器只看到较小的类空间,因此它不应该比普通类加载器慢。在某些情况下,它甚至可以像尼尔写的那样更快。OSGi服务也不应该影响性能。基本上,它们只是为接口查找Impl类的一种方法。因此,一旦您解析了Impl,它就只是一个没有开销的方法调用。不涉及序列化和代理。

使用OSGi的最大负面生产影响是,由于使用不同的类加载器加载多个版本的类,因此需要增加PermGen空间。除非根据需要在从操作系统分配的地方使用JRockit,否则最大PermGen大小在JVM启动时是固定的,并且很难清除是否存在易于收集的类加载器泄漏,这使得它可能是一种有限的资源


没有实质性的性能影响。在角落案例中,可能会有一些认知负荷,比如,通过不同类加载器加载同一类的实例将导致它们具有不同类型的instanceof返回false,如果比较obj.getClass.getName返回true,则不会影响性能。

我认为在实践中,可以避免在大多数情况下在多个类加载器中加载类。如果您不嵌入外部类,而是像在大多数情况下一样使用导入包,那么它们应该只加载一次。@ChristianSchneider如果您按照预期的方式使用导入包,并且指定了版本,那么您最终可能需要多个版本,因为需要加载多个版本才能满足这些要求依赖关系。更重要的是,考虑插件升级方案。在线程池的线程本地空间中保留一些内容?旧版本的类加载器无法卸载,新版本的线程会得到一个新的类加载器,并且你有一个漏洞。当然有可能,但只有当你在代码中有错误时才会发生。不过,我们可能需要一些更好的工具来找到这些东西。顺便说一句,同样的情况也可能发生在tomcat中。@ChristianSchneider tomcat有很多代码,旨在挖掘线程池成员中的线程本地空间,并试图消除附加到与已卸载应用程序关联的类的实例。你说得对,为Felix&co.购买类似的工具将是一件非常好的事情。@PeterKriens One不能在不增加永久性使用的情况下解决这个问题。仅仅因为某件事是一项开销并不意味着它是可以避免的,可以修复的,或者不值得权衡的。。。但把事情掩盖起来,不告诉评估解决方案的人权衡确实存在,这是愚蠢的,甚至是不诚实的,特别是当他们明确地问这个问题时。新来的人可能甚至不知道存在像PermGen space这样的东西。我不同意这样的说法,即唯一可以犯的错误是天真和愚蠢的。请参阅尚未回答的示例,并注意,您不需要自己犯此类错误-如果您的某个库为您这样做,这就足以导致泄漏。要明确的是,OSGi肯定是一件好事,但告诉人们不存在任何陷阱是在给人们制造麻烦。你的链接引出了一个关于Clojure的问题,我看不出有什么关联。您在自己的回答中抱怨的大多数问题都与动态重新加载有关。没有人会强迫你动态地重新加载;在标准Java中,你基本上不能这样做,所以这与比较无关。一个关于卸载Clojure运行时的问题。无法卸载它,但准备交换使用它的组件的版本吗?你刚刚发现了一个类加载器漏洞。事实上,没有人强迫你进行动态重新加载。类似地,没有人强迫您利用OSGi解决可传递依赖冲突的能力——但避免这些问题是使用它的一个重要方面,但利用该能力意味着您加载了同一类的多个实例,因此,即使不需要重新加载,也可以使用更多的PermGen空间。实际上,在OSGi中加载同一类的多个副本是非常罕见的,除非 动态更新。