チームメンバーにこれを詳しく調べてもらい、いくつかの興味深い結果が得られました。デフォルト構成の Spring は、メモリ使用量を特に控えめにすることにあまり関心がありません。大幅な改善のために微調整できる基本的な側面が 2 つあります。
OsgiBundleXmlApplicationContext
1 つ目は、そのクラスから拡張してメソッドをオーバーライドする場合にオーバーライドできる、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 フレームワークを変更すると、さらにかなりの量のメモリが節約されますが、これははるかに侵襲的な変更です。