4

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

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

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

谢谢

4

5 回答 5

8

根据我的经验,将应用程序从非 OSGi 迁移到 OSGi 环境(使用 Felix)对性能没有影响。我制作的每个版本都经过压力测试;压力测试的结果表明性能没有下降。

这可能取决于您的应用程序的功能。我将不考虑明确的 OSGi 概念(例如服务),因为此类新代码需要您自己进行测试,并且我假设您正在询问对现有 POJO 代码的影响。

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

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

对内存占用也有很小的影响。最好进行堆转储并使用 mat 之类的东西来分析它。

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

于 2012-07-12T11:24:19.357 回答
5

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

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

于 2012-07-12T15:00:19.453 回答
3

关于类加载性能的影响,我认为总体上 OSGi 与传统类加载模型的影响不是很大。

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

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

于 2012-07-12T18:42:53.477 回答
2

您可能必须计算框架的某些启动时间,但在运行时它对性能的影响基本上为零,因为简而言之它只是关于类加载。

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

于 2012-07-12T11:12:26.597 回答
1

我会说除非你考虑到类加载,否则不会有性能损失,但这只发生在你添加新模块(服务)或启动框架时。也许设计一个要模块化的应用程序这一事实会导致与其他架构相比性能有所下降,但这通常不会被考虑在内,因为这是 java 并且您可以制作一个可以 24/7 全天候运行的应用程序这一事实是 OSGi 的全部目的,那么您肯定可以牺牲一点性能(我会说)。

于 2012-07-13T13:51:57.040 回答