Ejercicio 1.3: Análisis de posibles fugas
Antes de empezar, complete el Ejercicio 1.2: Captura de vuelcos de almacenamiento dinámico.
En este ejercicio generará, en primer lugar, una lista de objetos (como, por ejemplo, matrices, vectores y sesiones) que parece que se están fugando. Se denominan "posibles fugas". A continuación, analizará la lista para identificar dichas fugas.
Generación de una lista de posibles fugas
Para generar la lista:
- Siga las instrucciones de la vista Posibles fugas, pulse el botón
de la barra de herramientas Analizar para detectar fugas. Se abre el recuadro de diálogo Seleccionar las opciones de Análisis de fugas.
- En el recuadro de diálogo, compruebe que los recuadros de los vuelcos de almacenamiento dinámico aparezcan marcados.
Nota: Por omisión, el valor de la opción Umbral es 20. Esto significa que sólo se visualizan las posibles fugas que tengan un valor de Probabilidad de 20 o mayor. (Más adelante, en este mismo ejercicio, se proporciona más información sobre los valores de Probabilidad.)
- Pulse Aceptar para generar la lista. En el indicador que aparece en el ángulo inferior izquierdo de Software Development Platform se informa de que se están buscando posibles fugas.
Una visión general de la vista Posibles fugas
Cuando se haya completado el proceso, en la vista Posibles fugas se mostrará una lista de las posibles fugas.
Cada posible fuga tiene un valor de Probabilidad que oscila entre 100 y 1; la fuga que tiene la probabilidad mayor tiene un valor de 100. Las demás posibles fugas se valoran consecuentemente, y se listan por orden de probabilidad descendente.
(El algoritmo de comparación de almacenamiento dinámico calcula los valores de probabilidad en función del tamaño de la fuga y su crecimiento durante el intervalo que existe entre los dos vuelcos de almacenamiento dinámico.)
El valor Umbral se ha establecido en 20 para esta ejecución de perfilado; no se mostrará ninguna fuga posible que tenga un valor de Probabilidad de 19 o menor.
En la vista se proporcionan los datos siguientes para cada posible fuga:
- Raíz de la fuga. Se trata del objeto de raíz de nivel superior que contiene referencias a los objetos que, potencialmente, se hayan fugado.
- Tipo de contenedor. Se trata de un objeto de recopilación que contiene los objetos que se hayan fugado. Las fugas suelen ocurrir, principalmente, en los objetos de recopilación como, por ejemplo, vectores y listas.
- Elemento que se está fugando. Se trata del tipo de los objetos que se han fugado.
- Número de fugas. Este valor representa el número de objetos del tipo especificado en la columna "Elemento que se está fugando" que aparecen en el objeto contenedor. Estos objetos pueden, a su vez, hacer referencia a otros objetos. Las columnas "Objetos que se han fugado" y "Bytes que se han fugado" incluyen estos objetos a los que se hace referencia.
- Bytes que se han fugado.
- Objetos que se han fugado.
Análisis e identificación de la fuga
Para identificar la fuga:
- En la vista Posibles fugas, busque los datos de la posible fuga que tenga una probabilidad de 100:
- La raíz de la fuga es TestThreeTierQueue.<ObjectID>.
- El tipo de contenedor es vector.
- Hay cadenas de caracteres que se están fugando del vector. En otras palabras, el vector conserva las referencias a cadenas de caracteres que, a juzgar por el número de fugas y el número de bytes que se han fugado, debe estar liberando información, de forma que la recopilación de basura pueda liberar memoria. (Probablemente, el número de fugas y el número de bytes que se han fugado será distinto cada vez que ejecute este programa, en función del tiempo durante el cual se hayan capturado los vuelcos de almacenamiento dinámico.)
- Efectúe una doble pulsación en la posible fuga. Se abre la vista Gráfico de referencia a objetos, en la que se visualizan los datos gráficos de la posible fuga. (Tenga en cuenta que es posible que la visualización del vuelco de almacenamiento dinámico tarde algún tiempo en aparecer.)
- Examine el gráfico de referencia a objetos. Observe lo siguiente:
- En el gráfico se resaltan los objetos que estén conectados, por referencias, con la posible fuga: la raíz de la fuga, pasando por SecondaryQueue, hasta llegar al vector, y finalmente, el conjunto de cadenas de caracteres que se han fugado. Esto proporciona una imagen visual de qué se está fugando.
- En el gráfico, aparece una matriz Object a la que hace referencia un Vector (el tipo de contenedor implicado en la fuga), y la matriz Object hace referencia a los objetos String.
- Coloque el cursor sobre la trayectoria que conecte la matriz Object y String, y lea la información sobre herramientas que se visualiza; se muestra un "Recuento" igual al número de fugas mostradas en la vista Posibles fugas; se trata de la recopilación de cadenas de caracteres que se ha identificado como la fuga que se ha producido.
- En el gráfico de referencia a objetos, efectúe una doble pulsación en el objeto String. Se abre la vista Detalles del objeto. En ella se visualizan todos los detalles del objeto String, incluidos todos los objetos que hacen referencia al mismo, y todos los objetos a los que él, a su vez, hace referencia. Tenga en cuenta que, en la vista Detalles del objeto, puede subir niveles hasta llegar a los referentes pulsando uno de ellos, o puede bajar niveles hasta llegar a los referenciados (objetos a los que el objeto hacer referencia), pulsando uno de ellos.
¿Qué ha averiguado? Ahora sabe que la cola secundaria es el objeto de fuga, y que se está fugando porque un objeto Vector retiene las referencias a muchos objetos String.
Ahora ya está preparado para comenzar el Ejercicio 1.4: Arreglo de fugas de memoria.