OSGi and performance?



OSGi是否适用于高性能应用程序服务器?

OSGi对生成高度模块化的应用程序有很大帮助,但由于执行模型与常规Java应用程序不同(因为我知道OSGi应用程序在特定平台上运行,如Apache Felix),对性能有什么影响。

在性能方面,您对不同的实现有什么经验?

感谢

根据我的经验,将应用程序从非OSGi环境移动到OSGi环境(使用Felix)对性能没有影响。我生产的每一个构建都要经过压力测试;压力测试的结果表明性能没有下降。

这可能取决于应用程序的功能。我将不考虑显式OSGi概念,如服务,因为这样的新代码需要您自己的测试,我假设您在问对现有POJO代码的影响。

OSGi环境的隐式影响主要在于类加载。正如您可能知道的,OSGi为每个捆绑包指定了单独的类加载器,并提供了一种将捆绑包中的代码连接到其他捆绑包中依赖项的方法。当一个bundle中的类调用另一个bundle中的类时,第二个bundle的类加载器负责加载第二个类。

与普通Java环境中使用的默认类加载器相比,这个类加载逻辑可能会消耗一些额外的工作。然而,除非您的代码本身不断地重新创建和重新加载类(这是不可能的),否则任何性能影响都可能是微不足道的。无论如何,这只是一种理论上的可能性。这取决于您选择的实现是否尽可能高效。

对内存占用也有一个小的影响。最好是把垃圾堆起来,用垫子之类的东西来分析。

相信我,你将花费更多的时间来了解OSGi的概念、OSGi容器、工具、版本管理之间的差异,以及比等待加载类更多的时间;)

OSGi可以由于更快的类加载而导致非常小的性能提升。由于有多个类加载器,它还可能导致内存消耗的小幅增加。

与您问题中的断言相反:OSGi不会改变Java执行模型

关于类加载性能的影响,我认为OSGi相对于传统类加载模型的影响通常不是很大。

我认为有两个因素支持和反对OSGi。你会受到通常不会受到的预先"惩罚",这就是解决阶段。需要解析捆绑包,并连接它们的依赖关系。还有其他复杂因素,如DynamicImport Package等。

然后是实际的类加载性能。这就是OSGi可能获胜的地方。在OSGi类加载的情况下,这是对已经连接的依赖关系的一个非常简单的委托。在传统类加载的情况下,这将是针对全局类路径的线性搜索。这将适用于您加载的每一个类。

您可能需要计算框架的特定启动时间,但在运行时,它对性能基本上没有影响,因为简而言之,它只是关于类加载。

相当多的现代应用程序服务器使用OSGi实现作为基础(例如JBoss、WebSphere、WebLogic、GlassFish),因此您可以确信它是可靠的,并且性能良好。请参阅此参考列表:http://en.wikipedia.org/wiki/OSGi#Projects_using_OSGi

我想说,除非考虑到类加载,否则不会有性能损失,但只有在添加新模块(服务)或启动框架时才会发生这种情况。与其他体系结构相比,将应用程序设计为模块化可能会导致性能下降,但这通常不会被考虑在内,因为这是java,而且你可以制作一个全天候工作的应用程序,这是OSGi的全部目的,那么你肯定可以牺牲那一点点性能(我想说)。

最新更新