2

OSGi の上に構築された Java アプリケーションのパフォーマンスの問題を診断しようとしています。プラットフォームは、組み込み Linux ボックスで実行される ARM5 プロセッサです。多くの場合、CPU 使用率は 100% で、メモリ消費量が高くなります。

私は組み込みの O/S 側にいます。Java 開発者は、組み込みよりもエンタープライズ アプリケーションの開発に熟練しています。私の経歴には組み込み Java も含まれていますが、まさにこの理由で OSGi を避けてきました。

簡単に解決できることを探しています。CPU とメモリの過剰な消費を引き起こしている可能性のある一般的な設計エラーは何ですか。CPU 使用率をはるかに妥当な値に戻すためにすぐに調査できます。

4

3 に答える 3

3

ここにいくつかの一般的なデザインの落とし穴があります。これがお役に立てば幸いです。

  • スレッドの作成は非常に「費用がかかる」場合があります。たとえば、常に新しいスレッドを作成するメッセージングは​​ありますか? スレッド プールを使用します。

  • オブジェクト (メッセージ、測定値など) についても同様です。特に、内部の 1 つのフィールドのみが変更される重いラッパーです。オブジェクトプールを使用してください - とても役に立ちます!

  • 文字列、特に連結には十分注意してください。文字列に対する単純な操作 (置換、追加、コピー) を呼び出すと、「表面下」で多くの一時オブジェクトが使用されることが多く、メモリとガベージ コレクションの両方に悪影響を及ぼします。非常に頻繁に実行されるコードで文字列の変更が行われる場合 (たとえば、ログ ヘルパー クラスの一般的なメソッド、プロトコルを介して送信するためのメッセージの作成を担当するメソッドなど)、無効なメソッドを使用しない実装に置き換える最適化。一時オブジェクトにより、パフォーマンスが大幅に向上します。

    • 使用するStringBuffer
    • 可能な限りString.indexOf(int)代わりに独自の文字列解析を使用するStringTokenizer
    • 経由の最初の文字比較string.charAt(0)はより高速ですString.startsWith(str)
    • 可能な限りString、代わりに の equals メソッドを使用するequalsIgnoreCase
  • 通常の作業中にデバッグ メッセージが含まれないようにログ レベルを調整します。これらすべてのデバッグ メッセージを単純に作成すると、システムの速度が大幅に低下する可能性があります。また、コンソールへの出力 (表示されていなくても) は、通常、システムの速度を低下させます。代わりに、常に OSGi Log サービスにログを記録してください。

于 2012-05-25T10:30:03.977 に答える
2

プロファイリングで多くの文字列が表示されたと投稿しました。そのため、古い Java パフォーマンス トラップに遭遇する可能性があります。

コードのどこかで次のようにすると、 myString = myString + " "; または同様のループで、毎回新しいオブジェクトが作成されます。このような場合、代わりに StringBuilder を使用するのが理にかなっています。これはただの勝手な推測ですが、私にも当てはまりました。

于 2012-05-21T10:07:22.457 に答える