OSGi
高性能アプリケーション サーバーに適合していますか?
OSGi
高度にモジュール化されたアプリケーションを作成するのに大いに役立ちますが、実行モデルが通常の Java アプリケーションとは異なるため、パフォーマンスへの影響はどうなりますか (OSGi
アプリケーションが特定のプラットフォームで実行されることを理解しているためApache Felix
)。
パフォーマンスに関して、さまざまな実装についてどのような経験がありますか?
ありがとう
OSGi
高性能アプリケーション サーバーに適合していますか?
OSGi
高度にモジュール化されたアプリケーションを作成するのに大いに役立ちますが、実行モデルが通常の Java アプリケーションとは異なるため、パフォーマンスへの影響はどうなりますか (OSGi
アプリケーションが特定のプラットフォームで実行されることを理解しているためApache Felix
)。
パフォーマンスに関して、さまざまな実装についてどのような経験がありますか?
ありがとう
私の経験では、アプリケーションを非 OSGi から OSGi 環境に (Felix を使用して) 移動しても、パフォーマンスに影響はありませんでした。私が作成する各ビルドは、ストレス テストを受けます。ストレス テストの結果、パフォーマンスの低下は見られませんでした。
アプリケーションの機能によって異なる場合があります。サービスなどの明示的なOSGi の概念は無視します。そのような新しいコードには独自のテストが必要であり、既存の POJO コードへの影響を尋ねていると仮定しています。
OSGi 環境の暗黙の影響は、主にクラスのロードにあります。おそらくご存じのとおり、OSGi はバンドルごとに個別のクラス ローダーを義務付けており、バンドル内のコードを他のバンドル内の依存関係に接続する方法を提供します。バンドル内のクラスが別のバンドル内のクラスを呼び出す場合、その 2 番目のクラス クラスをロードするのは、2 番目のバンドルのクラスローダーです。
このクラス ローディング ロジックは、通常の Java 環境で使用されるデフォルトのクラス ローダーよりも少し余分な作業を消費する可能性があります(おそらくそうではないでしょう)。ただし、コード自体が常にクラスを再作成および再ロードしている場合を除き、パフォーマンスへの影響はほとんどありません。いずれにせよ、それは単なる理論上の可能性です。可能な限り効率的になるように選択する実装次第です。
メモリ フットプリントにもわずかな影響があります。ヒープ ダンプを取得し、mat などを使用してこれを分析することをお勧めします。
OSGi の概念、OSGi コンテナーの違い、ツール、バージョン管理、およびクラスがロードされるのを待つよりもはるかに多くの時間を費やすことになるでしょう ;)
OSGi を使用すると、クラスローディングが高速になるため、パフォーマンスがわずかに向上する可能性があります。また、複数のクラスローダが原因でメモリ消費量がわずかに増加する可能性もあります。
質問の主張に反して、OSGi は Java 実行モデルを変更しません。
クラスローディング パフォーマンスの影響については、一般的に、OSGi と従来のクラスローディング モデルの影響はそれほど大きくないと思います。
OSGi には賛成と反対の 2 つの要因があると思います。通常は発生しない事前の「ペナルティ」があり、それが解決フェーズです。バンドルを解決し、それらの依存関係を配線する必要があります。DynamicImport-Package など、他にも複雑な要因があります。
次に、実際のクラスローディングのパフォーマンスがあります。これはおそらく OSGi が勝つところです。OSGi のクラスローディングの場合、すでに接続されている依存関係に対する非常に単純な委譲です。従来のクラスローディングの場合、これはグローバル クラスパスに対する線形検索になります。これは、ロードするすべてのクラスに適用されます。
フレームワークの特定の起動時間をカウントする必要がある場合がありますが、ランタイムでは、一言で言えばクラスのロードに関するものであるため、基本的にパフォーマンスへの影響はありません。
最新のアプリケーション サーバーの多くは、OSGi 実装 (JBoss、WebSphere、WebLogic、GlassFish など) をベースとして使用しているため、信頼性が高く、パフォーマンスが優れていることを確信できます。この参照リストを参照してください: http://en.wikipedia.org/wiki/OSGi#Projects_using_OSGi
クラスの読み込みを考慮しない限り、パフォーマンスの低下はないと思いますが、それは新しいモジュール (サービス) を追加するか、フレームワークを開始するときにのみ発生します。アプリケーションをモジュール化するように設計すると、他のアーキテクチャと比較してパフォーマンスが低下する可能性がありますが、これは Java であり、24 時間年中無休で動作するアプリケーションを作成できるため、通常は考慮されません。 OSGi の全体的な目的である場合は、そのパフォーマンスを少し犠牲にすることができます (私はそう思います)。