Domanda

Stiamo distribuendo un'applicazione su un dispositivo semi-incorporato con vincoli di memoria. Cercando di salvare tutto ciò che possiamo, stiamo analizzando i dump dell'heap dell'app e attaccando i maggiori consumatori.

Usiamo Spring 2.5 insieme a Spring DM 1.1 e notiamo che alcuni dei nostri bundle con contesti Spring più complessi stanno esaurendo un po 'di memoria poiché Spring sembra mantenere l'intero grafico degli oggetti contenente tutte le definizioni di bean che sono state analizzate dall'XML. Suppongo che la maggior parte di questo non sia necessario una volta che l'app è stata inizializzata e tutto viene iniettato.

Esistono opzioni di configurazione per Spring che consentono di controllare questo comportamento? Esegui in qualche modalità di memoria insufficiente? Gettare via tutte le cose inutili? Tempo di calcolo commerciale per dimensione?

È stato utile?

Soluzione

Ho fatto in modo che i membri del team avessero uno sguardo più approfondito e avessero ottenuto risultati interessanti. La primavera nella sua configurazione predefinita non è molto interessata a essere particolarmente conservatrice nell'uso della memoria. Ci sono 2 aspetti di base che possono essere modificati per ottenere guadagni significativi:

  • La prima è una proprietà non esposta all'interno della Spring OsgiBundleXmlApplicationContext che puoi sostituire se estendi da quella classe e ignori il metodo customizeBeanFactory.

L'abbiamo fatto così:

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

Impostazione di " setCacheBeanMetadata " la proprietà su false fa sì che BeanDefinitions (sostanzialmente il mirror programmatico della configurazione basata su XML) venga scartato dopo l'inizializzazione.

  • La seconda modifica - per la quale attualmente abbiamo un prototipo - è una patch per il codice sorgente di Spring per eseguire l'inizializzazione pigra delle raccolte. Si scopre che molti oggetti Spring interni che rappresentano Beans e tutte le loro proprietà hanno molti membri che sono inizializzati su HashMaps e altre raccolte per impostazione predefinita ma molto raramente sono riempiti con dati. La modifica del framework Spring per inizializzarli pigramente farà risparmiare un'altra quantità significativa di memoria, ma è un cambiamento molto più invasivo.

Altri suggerimenti

Puoi salvare un po 'di memoria con un BeanFactory - vedi 3.8.1. BeanFactory o ApplicationContext :

  

Poiché ApplicationContext include tutte le funzionalità di BeanFactory, si consiglia generalmente di utilizzarlo preferibilmente a BeanFactory, ad eccezione di alcune situazioni limitate come in un'applet, in cui il consumo di memoria potrebbe essere critico e alcuni kilobyte extra potrebbe fare la differenza.

Non sono a conoscenza di alcun modo per far funzionare Spring in " light " modalità. È possibile provare a implementare un BeanFactoryPostProcessor e utilizzarlo per rimuovere determinati bean dal contesto. Non ho idea se questo porterà a errori interni di primavera.

Se usi Spring solo all'avvio, cioè tutti i bean sono cablati e quindi non hai bisogno del contesto dell'applicazione o della logica di spegnimento, puoi avviare la tua app e quindi cancellare tutti i riferimenti al contesto dell'applicazione.

Se la configurazione di Spring utilizza AOP e la tessitura del tempo di caricamento, è possibile utilizzare aop.xml per recuperare un po 'di memoria da AspectJ utilizzando la funzionalità di demotion di tipo AspectJ introdotta in 1.6.5.

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

Analizza il tuo heap, se trovi molti oggetti RefType, il trucco sopra ti aiuterà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top