できるだけ多くのメモリを節約するように Spring を設定するにはどうすればよいですか?
-
20-08-2019 - |
質問
メモリの制約がある半組み込みデバイスにアプリケーションをデプロイしています。できる限りのものを保存しようと、アプリのヒープダンプを分析し、最大の消費者を攻撃しています。
私たちは Spring 2.5 を Spring DM 1.1 と一緒に使用していますが、Spring は XML から解析されたすべての BeanDefinition を含むオブジェクト グラフ全体を保持しているように見えるため、より複雑な Spring コンテキストを含む一部のバンドルがかなりのメモリを使用していることに気付きました。 。アプリが初期化され、すべてが挿入されれば、これらのほとんどは不要になると思います。
この動作を制御できる Spring の構成オプションはありますか?低メモリモードで実行していますか?不要なものをすべて捨てますか?サイズよりも計算時間を犠牲にしますか?
解決
チームメンバーにこれを詳しく調べてもらったところ、興味深い結果が得られました。デフォルト設定の Spring は、メモリ使用量を特に控えめにすることにあまり興味がありません。大幅な利益を得るために調整できる基本的な側面が 2 つあります。
- 1 つ目は、Spring 内の非公開プロパティです。
OsgiBundleXmlApplicationContext
そのクラスから拡張して、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 フレームワークを変更すると、さらに大量のメモリが節約されますが、より侵襲的な変更になります。
他のヒント
あなたはたBeanFactoryといくつかののメモリをを保存することができます - <のhref = "http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#context見ます導入 - -CTX-VS-たBeanFactory」のrel = "nofollowをnoreferrer"> 3.8.1。たBeanFactoryかApplicationContextののます:
は、ApplicationContextのは、一般に、メモリ消費が重要でいくつかの余分なキロバイトであるかもしれないアプレットのようないくつかの限定された状況を除いて、それがたBeanFactoryに優先して使用することが推奨され、たBeanFactoryのすべての機能を含むように違いを生むかもしれません。
私は、春は「光」モードで実行させるためにどのような方法を認識していませんよ。あなたはBeanFactoryPostProcessorを実装しようとすると、コンテキストから特定の豆を削除するためにそれを使用することができます。私は、しかし、内部の春のエラーにつながることが起こっているのかどうかわかりません。
はあなただけの起動時に春を使用する場合は、のすなわちはすべてのBeanが配線され、その後、あなたは、あなたがあなたのアプリを起動することができ、アプリケーション・コンテキストまたはシャットダウンロジックを必要としませんその後、アプリケーションコンテキストへのすべての参照を消去します。
あなたのSpring構成は、AOPとロード時間の織りを使用している場合は、1.6.5で導入されたAspectJのタイプの降格機能を使用して、AspectJのからいくつかのメモリを取り戻すためにaop.xmlを使用することができます。
<weaver options="-Xset:typeDemotion=true"/>
あなたは多くのRefTypeオブジェクトを見つけた場合、上記のトリックを助ける、あなたのヒープを分析します。