Tecnología

Inicio

HashMap: Cómo eliminar la causa de una pérdida de memoria

Las bibliotecas estándar para el lenguaje de programación Java proporcionan la HashMap clase. Un HashMap es una asignación de claves a valores, donde las claves y los valores pueden pertenecer a cualquier clase de Java dado. Entre otras operaciones, HashMap proporciona un método para encontrar el valor asociado a una clave dada y para añadir y eliminar (clave, valor) pares de la HashMap. HashMaps son una fuente común de errores de pérdida de memoria en los programas de Java: las instancias de una clase se gestionan correctamente por el código, pero un error de programación no posibiliten su borrado de la HashMap cuando ya no son necesarios. Debido a que existe al menos una destacada referencia a esos objetos huérfanos, recolector de basura de Java no puede recuperar su memoria, por lo que el tiempo de ejecución de Java se ejecuta finalmente sin memoria de pila.

Instrucciones

1 Ejecutar la aplicación Java con la herramienta de perfiles (hprof) activado y perfiles de registro del montón. La forma precisa de hacer esto depende del sistema operativo. Por ejemplo, en Linux, inicie la aplicación de la siguiente manera:

java -Xrunhprof: file = MyLog.txt, montón = sitios Myapp

Reemplazar myApp por el nombre de la aplicación Java. Esta invocación se inicia la máquina virtual de Java (JVM) en el modo de perfil; la JVM escribe la salida del generador de perfiles para presentar MyLog.txt.

2 Hacer que su proceso de solicitud alguna carga de trabajo, por lo que los objetos (en particular, HashMaps) se asignan y se descartan. Tomar una instantánea del estado del montón. Por ejemplo, en Linux, el generador de perfiles genera una instantánea del estado de la pila cuando se ejecuta:

matar a -3 jvmPID

Reemplazar jvmPID con el identificador de proceso de la instancia JVM que ejecuta la aplicación. Hprof anexa una instantánea de la pila con el contenido actual de MyLog.txt archivo.

3 Hacer que su proceso de aplicación más o menos la misma cantidad de carga de trabajo para que más objetos son creados y recolección de basura. Otra instantánea del estado de la pila como en el paso 2.

4 Compare las dos instantáneas tomadas en los pasos 2 y 3. En particular, mirar las líneas entre los "sitios de comenzar" y "SITIOS DE FIN." Identificar las clases cuyos objetos han aumentado más en número entre las dos instantáneas; esos son los responsables de las pérdidas de memoria, ya que la carga procesada por su aplicación era más o menos constante a través de las dos instantáneas.

5 Examinar las instantáneas para identificar las partes del código de asignación de objetos que no se deje liberados cuando sea necesario. Por eso, concentrarse en las líneas que comienzan con "TRACE" que tienen un "<init>" evento en la siguiente línea instantánea, para cada una de las clases identificadas en el paso 4.

6 Incluir las supresiones que falta de referencias a las clases de problemas para las partes de su código identificados en el Paso 5. Las pérdidas de memoria ya no ocurren.