Condividi tramite


Prevenzione delle perdite di memoria nelle applicazioni Windows

Piattaforme interessate

Client - Windows 7
Server - Windows Server 2008 R2

Descrizione

Le perdite di memoria sono una classe di bug in cui l'applicazione non riesce a rilasciare memoria quando non è più necessaria. Nel tempo, le perdite di memoria influiscono sulle prestazioni di entrambe le applicazioni e sul sistema operativo. Una grande perdita potrebbe causare tempi di risposta inaccettabili a causa di paging eccessivo. Alla fine l'applicazione e altre parti del sistema operativo riscontrano errori.

Windows libera tutta la memoria allocata dall'applicazione alla terminazione del processo, quindi le applicazioni a breve esecuzione non influiscono in modo significativo sulle prestazioni complessive del sistema. Tuttavia, le perdite nei processi a esecuzione prolungata come i servizi o anche i plug-in explorer possono influire notevolmente sull'affidabilità del sistema e potrebbero forzare l'utente a riavviare Windows per rendere nuovamente utilizzabile il sistema.

Le applicazioni possono allocare memoria per conto di più mezzi. Ogni tipo di allocazione può causare una perdita se non liberata dopo l'uso. Ecco alcuni esempi di modelli di allocazione comuni:

  • Memoria heap tramite la funzione HeapAlloc o il runtime C/C++ equivale a malloc o nuovo
  • Allocazioni dirette dal sistema operativo tramite la funzione VirtualAlloc .
  • Handle del kernel creati tramite API Kernel32, ad esempio CreateFile, CreateEvent o CreateThread, mantenere la memoria del kernel per conto dell'applicazione
  • Handle GDI e USER creati tramite API User32 e Gdi32 (per impostazione predefinita, ogni processo ha una quota di 10.000 handle)

Procedure consigliate

Il monitoraggio dell'utilizzo delle risorse dell'applicazione nel tempo è il primo passaggio nel rilevare e diagnosticare perdite di memoria. Usare Gestione attività windows e aggiungere le colonne seguenti: "Dimensioni commit", "Handle", "Oggetti utente" e "Oggetti GDI". In questo modo è possibile stabilire una baseline per l'applicazione e monitorare l'utilizzo delle risorse nel tempo.

Screenshot che mostra la pagina

Gli strumenti Microsoft seguenti forniscono informazioni più dettagliate e consentono di rilevare e diagnosticare perdite per i vari tipi di allocazione nell'applicazione:

  • Monitor prestazioni e Monitoraggio risorse fanno parte di Windows 7 e possono monitorare e usare le risorse grafo nel tempo
  • La versione più recente di Application Verifier può diagnosticare le perdite di heap in Windows 7
  • UMDH, che fa parte degli strumenti di debug per Windows, analizza le allocazioni di memoria heap per un determinato processo e può aiutare a trovare perdite e altri modelli di utilizzo insoliti
  • Xperf è uno strumento di analisi delle prestazioni sofisticato con supporto per le tracce di allocazione heap
  • L'heap di debug CRT tiene traccia delle allocazioni heap e può aiutare a creare funzionalità di debug heap personalizzate

Alcune procedure di codifica e progettazione possono limitare il numero di perdite nel codice.

  • Usare puntatori intelligenti nel codice C++ sia per le allocazioni heap che per le risorse Win32, ad esempio handledel kernel. La libreria Standard C++ fornisce la classe auto_ptr per le allocazioni heap. Per altri tipi di allocazione è necessario scrivere classi personalizzate. La libreria ATL offre un set completo di classi per la gestione automatica delle risorse per gli oggetti heap e i handle del kernel
  • Usare le funzionalità intrinseche del compilatore come _com_ptr_t per incapsulare i puntatori di interfaccia COM in "puntatori intelligenti" e assistere il conteggio dei riferimenti. Esistono classi simili per altri tipi di dati COM: _bstr_t e _variant_t
  • Monitorare l'utilizzo insolito della memoria del codice .NET. Il codice gestito non è immune alle perdite di memoria. Vedere "Rilevamento delle perdite di memoria gestite" su come trovare perdite di memoria GC
  • Tenere presente i modelli di perdita nel codice lato client Web. Riferimenti circolari tra oggetti COM e motori di scripting come JScript possono causare perdite di grandi dimensioni nelle applicazioni Web. "Informazioni e risoluzione dei modelli di perdita di Internet Explorer" contiene altre informazioni su questi tipi di perdite. È possibile usare javaScript Memory Leak Detector per eseguire il debug delle perdite di memoria nel codice. Mentre Windows Internet Explorer 8, che è in spedizione con Windows 7, riduce la maggior parte di questi problemi, i browser meno recenti sono ancora vulnerabili a questi bug
  • Evitare di usare più percorsi di uscita da una funzione. Le allocazioni assegnate alle variabili nell'ambito della funzione devono essere liberate in un determinato blocco alla fine della funzione
  • Non usare eccezioni nel codice senza liberare tutte le variabili locali nelle funzioni. Se si usano eccezioni native, liberare tutte le allocazioni all'interno del blocco di __finally. Se si usano eccezioni C++, è necessario eseguire il wrapping di tutte le allocazioni di heap e handle nei puntatori intelligenti
  • Non eliminare o reinizializzare un oggetto PROPVARIANT senza chiamare la funzione PropVariantClear

Modelli di allocazione comuni:

Strumenti Microsoft:

Collegamenti aggiuntivi: