2009-06-26 82 views
6

我們在具有內存限制的半嵌入式設備上部署應用程序。我們正在分析應用程序的堆轉儲並攻擊最大的消費者,希望能夠盡我們所能挽救。如何配置Spring以儘可能節省內存?

我們將Spring 2.5和Spring DM 1.1一起使用,我們注意到一些帶有更復雜的Spring上下文的bundle使用了相當多的內存,因爲Spring似乎圍繞着包含所有BeanDefinitions的整個對象圖從XML中解析。我會假設一旦應用程序初始化並注入了所有內容,大多數情況都是不必要的。

是否有配置選項讓Spring能夠控制這種行爲?在一些低內存模式下運行?扔掉所有不必要的東西?交易計算時間的大小?

回答

5

我讓團隊成員對此有了更深入的瞭解並獲得了一些有趣的結果。 Spring的默認配置非常不感興趣,因爲其內存使用情況特別保守。有跡象表明,可以調整爲顯著收益2個基本方面:

  • 首先是春天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的配置的鏡像)初始化後丟棄。

  • 第二個變化 - 我們目前有一個原型 - 是Spring源代碼對集合進行延遲初始化的補丁。事實證明,許多表示Beans及其所有屬性的內部Spring對象都有很多成員默認初始化爲HashMaps和其他集合,但很少填充數據。改變Spring框架以便懶惰地初始化這些將會節省大量的內存,但這是一個非常有創意的改變。
1

您可以保存一些內存一個BeanFactory - 看3.8.1. BeanFactory or ApplicationContext

由於ApplicationContext中包括了BeanFactory所有的功能,所以一般建議將其優先用於BeanFactory中,除了一些有限的情況,例如在Applet中,內存消耗可能很重要,少數多餘的千字節可能會有所作爲。

+0

將所有我們的應用程序上下文定義重寫爲Java中的命令性BeanFactory調用根本不是一個選項。 – 2009-06-26 15:37:01

0

我不知道有什麼辦法讓Spring在「light」模式下運行。你可以嘗試實現一個BeanFactoryPostProcessor並使用它從上下文中刪除某些bean。但我不知道這是否會導致內部彈簧錯誤。

+0

這就是我所害怕的,爲了以防萬一,我會繼續討論這個問題。 – 2009-06-28 11:48:04

0

如果你只在啓動時使用Spring,所有的bean被有線,那麼你並不需要在應用程序上下文或關閉邏輯,你就可以開始你的應用程序,然後清除到應用環境中的所有引用。

+0

Spring本身保持對應用程序上下文的引用,我們不明確地做它。我不確定我們可以刪除哪些引用。 – 2009-06-30 15:38:13

0

如果您的Spring配置使用AOP並加載時織入,您可以使用aop.xml通過使用1.6.5中引入的AspectJ類型降級功能從AspectJ重新獲得一些內存。

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

分析你的堆,如果你發現許多RefType對象,上面的技巧將會有所幫助。

+0

我們不使用AOP,但感謝提示! – 2009-07-13 18:04:46