7

メモリの制約があるセミエンベデッド デバイスにアプリケーションを展開しています。アプリのヒープダンプを分析し、最大の消費者を攻撃して、できる限り節約しようとしています。

Spring 2.5 を Spring DM 1.1 と一緒に使用していますが、Spring は XML から解析されたすべての BeanDefinitions を含むオブジェクト グラフ全体を保持しているように見えるため、より複雑な Spring コンテキストを持つバンドルの一部がかなりの量のメモリを使い果たしていることに気付きました。 . アプリが初期化され、すべてが注入されたら、これのほとんどは不要であると思います。

この動作を制御できるSpringの構成オプションはありますか? 低メモリモードで実行しますか? 不要なものをすべて捨てる?計算時間をサイズと引き換えに?

4

5 に答える 5

5

チームメンバーにこれを詳しく調べてもらい、いくつかの興味深い結果が得られました。デフォルト構成の Spring は、メモリ使用量を特に控えめにすることにあまり関心がありません。大幅な改善のために微調整できる基本的な側面が 2 つあります。

  • OsgiBundleXmlApplicationContext1 つ目は、そのクラスから拡張してメソッドをオーバーライドする場合にオーバーライドできる、Spring 内の公開されていないプロパティcustomizeBeanFactoryです。

次のようにしました。

@Override
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
    super.customizeBeanFactory(beanFactory);
    String cacheBeanMetadataSysProp = System.getProperty(CACHE_BEAN_METADATA, "true");
    if (cacheBeanMetadataSysProp != null
        && cacheBeanMetadataSysProp.equalsIgnoreCase("false")) {
        beanFactory.setCacheBeanMetadata(false);
    } else if (cacheBeanMetadataSysProp != null
        && cacheBeanMetadataSysProp.equalsIgnoreCase("true")) {
        beanFactory.setCacheBeanMetadata(true);
    }
}

「setCacheBeanMetadata」プロパティを に設定するfalseと、BeanDefinitions(基本的には XML ベースの構成のプログラムによるミラー) が初期化後に破棄されます。

  • 2 番目の変更 (現在プロトタイプがある) は、コレクションの遅延初期化を行うための Spring ソース コードのパッチです。Bean とそのすべてのプロパティを表す多くの内部 Spring オブジェクトには、デフォルトで HashMap やその他のコレクションに初期化されているメンバーが多数ありますが、データで満たされることはほとんどありません。これらを遅延して初期化するように Spring フレームワークを変更すると、さらにかなりの量のメモリが節約されますが、これははるかに侵襲的な変更です。
于 2009-07-20T14:52:55.723 に答える
1

BeanFactory を使用してメモリを節約できます- 3.8.1 を参照してください。BeanFactory または ApplicationContext :

ApplicationContext には BeanFactory のすべての機能が含まれているため、通常、BeanFactory より優先して使用することをお勧めします。違い。

于 2009-06-26T15:25:04.603 に答える
0

Spring 構成で AOP とロード時間ウィービングを使用している場合、1.6.5 で導入された AspectJ タイプの降格機能を使用して、aop.xml を使用して AspectJ からメモリを取り戻すことができます。

<weaver options="-Xset:typeDemotion=true"/>

ヒープを分析してください。多くの RefType オブジェクトが見つかった場合は、上記のトリックが役に立ちます。

于 2009-07-12T10:22:55.153 に答える
0

起動時にのみ Spring を使用する場合、つまり、すべての Bean が接続されていて、アプリケーション コンテキストまたはシャットダウン ロジックが必要ない場合は、アプリを起動してから、アプリケーション コンテキストへのすべての参照をクリアできます。

于 2009-06-29T07:57:04.980 に答える