Tips & Tricks: problemi di memoria

by Giuseppe Lanzi on 26 novembre 2014

Capita alle volte che i programmatori non abbiano a che fare la soluzione di problemi algoritmici, ma che debbano risolvere problemi legati all’uso della memoria dell’applicazione.

Certo è sempre un problema di come viene scritto il codice, ma rispetto ad un errore algoritmico che si mostra immediatamente (alle volte anche all’utente finale) un errore di gestione della memoria si fa vedere solo ad un certo punto, quando le cose sono degradate troppo e il server ha finito la memoria disponibile. Un effetto che può risultare anche molto lontano dalla causa.

In questi casi dobbiamo dare risposta alla domanda “ma dov’è che ho messo tutta questa memoria?”. Oggi scrivo questo post per dare un paio di consigli apparentemente semplici ma che ho notato essere utili.

Come prima cosa è bene utilizzare uno strumento efficace per l’analisi, non affidatevi semplicemente a quello che vi dice Task Manager perché non è uno strumento pensato per questo scopo. Task Manager vi informa semplicemente del fatto che una certa applicazione sta usando un certo quantitativo di memoria del sistema operativo, ma non vi dice in quali classi è usata e soprattutto non fa distinzione tra memoria effettivamente usata dell’applicazione e quella che il server web tiene per sé perché sa di poterne avere bisogno.

Per fare una prova con questo piccolo progetto di esempio su IIS e capire di che tipo di strumento sto parlando, vi consiglio di provare la demo di ANTS Memory Profiler, che ho trovato davvero efficace e di aiuto in un compito complesso come la soluzione di un memory leak.

Provate ad aprire la videatea New Form IMDB e a controllare in quali classi viene usata la memoria, troverete live instance di IMDBFldValue che corrispondono alle 30.000 righe che ho inserito in una tabella IMDB (le In Memory Database di Instant Developer).

Provate a chiudere la videata e a ricontrollare la memoria, avrete sempre lo stesso numero di istanze di IMDBFldValue ancora “vive” in memoria. Succede perché le tabelle IMDB sono fatte apposta per essere accessibili da tutta l’applicazione, da questo punto di vista sono da considerare al pari di una variabile globale. Alla chiusura della videata New Form IMDB la tabella IMDB contenuta all’interno non viene quindi svuotata ma tenuta in memoria per l’eventuale riutilizzo da parte di altre procedure dell’applicazione.

Ed è qui che entra in ballo il secondo consiglio, rivolto a chi utilizza Instant Developer. E’ prassi comune svuotare le tabelle IMDB subito prima di riempirle, tipicamente questo accade quando si apre la videata, ma se usate IMDB di grandi dimensioni potreste incorrere in problemi di memoria se non svuotate le tabelle anche alla chiusura della form usando l’evento di Unload.

Provate a scommentare il contenuto dell’evento nel progetto e vedrete subito la differenza.

Mi aiuti a scegliere il prossimo articolo dei Tips & Tricks?

  •    Gestione della sincronizzazione con utenti/oggetti multidominio
  •    Intregrare librerie javascript nelle proprie applicazioni offline
  •    Altro che articolo sul blog, ci vuole un bel webinar sulla personalizzazione grafica

{ 2 comments… read them below or add one }

1 Mauro Marini 27 novembre 2014 alle 15:45

Molto interessanti e utili questi post su strumenti “complementari” a Inde, ma necessari per la realizzazione di applicazioni.

Butto lì una proposta: se trovate qualche strumento come ANTS che va a nozze con INDE magari si potrebbe tentare un accordo per ottenere uno sconto per i clienti Inde. Alla peggio dicono no. Se poi la cosa funziona e gli sviluppatori Inde ne approfittano, si potrebbe estendere anche a qualche libreria non open di grande interesse (grafici o altro).

Noto infine con piacere che nel questionario ci sono proposte per approfondire la personalizzazione della grafica e l’integrazione con javascript. Due temi complementari e altrettanto necessari del controllo dei memory leaks. Li avrei votati entrambi.
Un saluto

2 Samuele Firpo 27 novembre 2014 alle 15:59

Articolo molto interessante!
Non è che per caso qualcuno è a conoscenza di qualche strumento simile per la piattaforma Java?

Leave a Comment

Previous post:

Next post: