Esercizio 1.3: Analisi di probabili perdite di dati
Prima di iniziare, è necessario aver completato l'Esercizio 1.2 Cattura di dump di heap.
In questo esercizio, inizialmente verrà creato un elenco di oggetti (ad esempio, matrici, vettori e sessioni) che sembrano perdere dati. Questi risultano essere le "probabili perdite di dati". Verrà quindi analizzato l'elenco al fine di individuare eventuali perdite di dati.
Creazione di un elenco di probabili perdite di dati
Per creare l'elenco:
- Seguendo le istruzioni presenti nella vista Probabili perdite di dati, fare clic sul pulsante della barra degli strumenti Analisi perdita di dati
. Viene visualizzata la finestra di dialogo Seleziona le opzioni perdita di dati. - Nella finestra di dialogo, accertarsi che le caselle di controllo relative ai due dump di heap siano selezionate.
Nota: il valore predefinito impostato per Soglia è 20. Ciò significa che vengono visualizzate solo le probabili perdite di dati con valore Probabilità uguale a 20 o superiore (di seguito in questo esercizio, verranno fornite ulteriori informazioni sui valori relativi a Probabilità).
- Fare clic su OK per creare l'elenco. L'indicatore presente nell'angolo in basso a destra della piattaforma Software Development contiene l'indicazione che è in atto la ricerca di probabili perdite di dati.
Panoramica della vista Probabili perdite di dati
Una volta terminato il processo, nella vista Probabili perdite di dati viene visualizzato un elenco di probabili perdite di dati.
Ciascun candidato ha un valore di probabilità compreso tra 100 e 1, dove l'elemento con la più probabile perdita di dati ha come valore 100. Gli altri elementi con probabili perdite di dati, sono classificati conseguentemente e vengono visualizzati in ordine di probabilità decrescente
(l'algoritmo per il confronto di heap calcola i valori di probabilità in base alla portata della perdita di dati e all'incremento che si verifica durante l'intervallo tra due dump di heap).
Il valore Soglia impostato per l'esecuzione della presente creazione di profili era 20; non verranno visualizzate le probabili perdite di dati con un valore Probabilità pari a 19 o inferiore.
La vista fornisce per ogni probabile perdita di dati quanto riportato di seguito:
- Origine perdita di dati. Corrisponde all'oggetto origine di livello superiore che contiene riferimenti agli oggetti potenzialmente persi.
- Tipo contenitore. Corrisponde ad un oggetto di raccolta che contiene gli oggetti persi. È molto probabile che la perdita si verifichi in oggetti di raccolta, come ad esempio vettori ed elenchi.
- Dati persi. Corrisponde al tipo di oggetti persi.
- Numero di perdite di dati. Corrisponde al numero di oggetti del tipo specificato nella colonna "Dati persi" presenti nell'oggetto contenitore. Tali oggetti possono a loro volta fare riferimento ad altri oggetti. Le colonne "Oggetti persi" e "Byte persi" includono tali oggetti referenziati.
- Byte persi.
- Oggetti persi.
Analisi ed individuazione della perdita di dati
Per individuare la perdita di dati:
- Nella vista Probabili perdite di dati, osservare i dati relativi alle probabili perdite di dati la cui probabilità è pari a 100:
- L'origine della perdita di dati è TestThreeTierQueue.<ObjectID>
- Il tipo contenitore è vector.
- Il vettore corrisponde a stringhe perse. Ovvero, il vettore contiene riferimenti a stringhe, che a giudicare dal numero di perdite di dati e dal numero di byte persi, dovrebbe essere rilasciato in modo che la raccolta di dati obsoleti possa liberare memoria (il numero di perdite di dati e il numero di byte persi potrebbe essere diverso ogni volta che si esegue questo programma, a seconda della tempistica con cui vengono catturati i dump di heap).
- Fare doppio clic sulla probabile perdita di dati. Viene visualizzata la vista Grafico riferimento oggetto che contiene dati in formato grafico relativi alla probabile perdita di dati (tenere presente che la visualizzazione del dump di heap potrebbe richiedere del tempo).
- Esaminare il grafico riferimento oggetto. Osservare i seguenti punti:
- Il grafico evidenzia gli oggetti che risultano collegati, tramite riferimenti, alla probabile perdita di dati: dall'origine della perdita di dati, a SecondaryQueue, fino al vettore ed infine alla serie di stringhe perse. Ciò fornisce un'immagine immediata dei dati persi.
- Nel grafico è presente una matrice Object referenziata da un Vector (il tipo di contenitore coinvolto nella perdita di dati) e la matrice Object fa riferimento agli oggetti String persi.
- Posizionare il cursore sul percorso che collega la matrice Object e String e leggere la descrizione comandi visualizzata: questa mostra un "Conteggio" uguale al numero di perdite di dati contenuto nella vista Probabili perdite di dati, cosicché questa rappresenta la raccolta di stringhe che sono state individuate come perdite di dati.
- Osservare che Secondary e Tertiary Queues conservano riferimenti alla matrice Oggetto, ma Tertiary Queue non è indicata nella vista Probabili perdite di dati come probabile perdita. Le possibili spiegazioni sono:
- Tertiary Queue potrebbe risultare con perdita di dati, ma ad un livello inferiore di Secondary Queue. Se si esegue nuovamente l'analisi di perdite di dati con un valore soglia inferiore a 20 che è quello predefinito, potrebbe essere visualizzata una perdita di dati per Tertiary Queue.
- Per Tertiary Queue potrebbero continuare a sussistere buone ragioni per mantenere i riferimenti all'oggetto matrice [Object, cosicché non si verifica una perdita di dati nella memoria bensì questi vengono conservati. La questione sarà chiarita non appena verrà corretto il codice per Secondary Queue e verrà rieseguita l'applicazione a cui sono state apportate le modifiche.
- Nel grafico riferimento oggetto, fare doppio clic sull'oggetto String. Viene visualizzata la vista Dettagli oggetto. In essa sono contenuti tutti i dettagli relativi all'oggetto String, compresi gli oggetti che vi fanno riferimento e tutti gli oggetti a cui questo di volta in volta fa riferimento. Tenere presente che nella vista Dettagli oggetto è possibile spostarsi verso l'alto sugli oggetti referenti facendo clic su uno di essi oppure verso il basso sui referenziati (ovvero oggetti a cui l'oggetto fa riferimento) facendo clic su uno di essi.
Risultati ottenuti: A questo punto si è a conoscenza del fatto che Secondary Queue corrisponde all'oggetto con perdita di dati e che la causa è dovuta al fatto che l'oggetto Vector contiene riferimenti a molti oggetti String.
A questo punto, si è pronti per iniziare l'Esercizio 1.4: Risoluzione delle perdite di dati di memoria.