Frage

Wir sind die Bereitstellung einer Anwendung auf einem halb eingebettete Gerät, Speicherbeschränkungen hat. Suchen Sie zu sparen, was wir können wir Heapspeicherauszüge der App analysieren und die größten Verbraucher angreifen.

Wir verwenden Spring 2.5 zusammen mit Frühling DM 1.1 und wir bemerken, dass einige unserer Bündel mit komplexeren Frühling Kontexten ziemlich viel Speicher mit bis seit dem Frühjahr um den gesamten Objektgraphen zu halten scheint alle BeanDefinitions enthalten, die analysiert wurden aus dem XML. Ich würde davon ausgehen, dass die meisten dies nicht erforderlich ist, wenn der App initialisiert wurde und alles eingespritzt wird.

Gibt es Konfigurationsoptionen für den Frühling, die es erlauben, dieses Verhalten zu kontrollieren? Führen Sie in einigen Low-Memory-Modus? Werfen Sie alle unnötigen Dinge weg? Handelsrechenzeit für die Größe?

War es hilfreich?

Lösung

Ich hatte Teammitglieder haben einen tieferen Blick auf diese und hatte einige interessante Ergebnisse. Frühling in der Standardkonfiguration ist sehr viel nicht daran interessiert ist, besonders konservativ in seiner Speichernutzung. Es gibt zwei grundlegende Aspekte, die für signifikante Gewinne gezwickt werden kann:

  • Die erste ist eine nicht-exponierten Eigenschaft innerhalb des Feder OsgiBundleXmlApplicationContext die Sie überschreiben können, wenn Sie von dieser Klasse erweitern und die customizeBeanFactory Methode außer Kraft setzen.

Wir haben es wie folgt aus:

@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);
    }
}

Einstellen der „setCacheBeanMetadata“ Eigenschaft auf false die BeanDefinitions verursacht (im Grunde den programmatischen Spiegel Ihrer XML-basierte Konfiguration) nach der Initialisierung verworfen werden.

  • Die zweite Änderung -, dass wir derzeit einen Prototyp haben für - ist ein Patch für den Code Frühling Quelle verzögerte Initialisierung von Sammlungen zu tun. Es stellt sich heraus, dass viele interne Federobjekte, die Bohnen und alle ihre Eigenschaften haben viele Mitglieder, die initialisiert werden HashMaps und andere Sammlungen von Standard dar, sondern sind sehr selten mit Daten gefüllt. das Spring-Framework ändern diese träge initialisieren wird eine weitere erhebliche Menge an Speicherplatz sparen, aber es ist eine viel invasive Veränderung.

Andere Tipps

Sie sparen können einige Speicher mit einer BeanFactory - siehe 3.8.1. BeanFactory oder Application :

  

Wie die Application enthält alle Funktionen des BeanFactory, wird es in der Regel empfohlen, dass es bevorzugt gegenüber dem BeanFactory verwendet werden, mit Ausnahme von ein paar wenigen Situationen wie in einem Applet, wo der Speicherverbrauch von entscheidenden Bedeutung sein könnte und ein paar zusätzlichen Kilobyte könnte einen Unterschied machen.

Ich bin von keiner Weise bewusst Frühjahr läuft im „Licht“ Modus zu machen. Sie könnten versuchen, ein BeanFactoryPostProcessor Implementierung und es verwenden, bestimmte Bohnen aus dem Kontext zu entfernen. Ich habe keine Ahnung, ob das geht jedoch auf interne Feder Fehler führen.

Wenn verwenden Sie nur Frühling beim Start, dh alle Bohnen sind verdrahtet und dann müssen Sie nicht den Anwendungskontext oder die Shutdown-Logik, können Sie Ihre Anwendung starten und deaktivieren Sie alle Verweise auf den Anwendungskontext.

Wenn Sie Ihre Spring-Konfiguration verwendet AOP und Ladezeit Weben, könnten Sie aop.xml verwenden einige Speicher von AspectJ wieder mithilfe von AspectJ Typ Degradierung Funktion, die in 1.6.5 eingeführt wurde.

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

Analysieren Sie Ihre Heap, wenn Sie viele RefType Objekte, der Trick oben finden helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top