Si trabajas habitualmente con Android Studio, es posible que en algún momento aparezca en tu disco un archivo con un nombre parecido a java_pid18452.hprof o a java_pid14468.hprof. La sorpresa suele ser mayor cuando comprobamos su tamaño: estos archivos pueden ocupar varios cientos de megabytes e incluso varios gigabytes.
Además, en Windows podemos encontrarnos con que el archivo no se puede eliminar inmediatamente porque algún proceso Java todavía lo está utilizando.
En este artículo veremos qué son los archivos .hprof, por qué aparecen al utilizar Android Studio o Gradle, cuándo se pueden borrar y, sobre todo, cómo evitar que vuelvan a generarse automáticamente.
¿Qué es un archivo .hprof?
Un archivo .hprof es un volcado de la memoria Heap de una aplicación Java. Heap es la zona de memoria utilizada por Java para almacenar objetos durante la ejecución del programa.
Cuando se genera un archivo de este tipo se está guardando una fotografía del estado de esa memoria en un momento determinado.
El nombre normalmente sigue este formato: java_pidXXXXX.hprof donde XXXXX corresponde al PID —Process ID— del proceso Java que generó el archivo.
Por ejemplo, java_pid18452.hprof indica que el proceso Java con PID 18452 generó ese volcado de memoria.
¿Para qué sirven estos archivos?
Los archivos .hprof son fundamentalmente archivos de diagnóstico. Permiten analizar, entre otras cosas:
- qué objetos estaban ocupando memoria;
- cuánta memoria consumía cada tipo de objeto;
- posibles fugas de memoria;
- objetos que permanecen referenciados innecesariamente;
- causas de un consumo excesivo de Heap;
- situaciones relacionadas con un OutOfMemoryError.
Pueden analizarse con herramientas específicas de profiling y análisis de memoria. Para un desarrollador que esté investigando un problema serio de memoria pueden ser muy útiles. Sin embargo, si no estamos realizando este tipo de análisis, normalmente estos archivos no nos sirven para nada.
¿Por qué Android Studio genera archivos java_pidXXXXX.hprof?
Android Studio está desarrollado sobre la plataforma IntelliJ IDEA y se ejecuta utilizando una máquina virtual Java. Además, al desarrollar un proyecto Android intervienen otros procesos Java, como:
- Android Studio;
- Gradle;
- Gradle Daemon;
- herramientas de compilación;
- procesos auxiliares.
Cuando alguno de esos procesos agota la memoria disponible puede producirse un error
java.lang.OutOfMemoryError
La JVM puede estar configurada con la opción -XX:+HeapDumpOnOutOfMemoryError. Esta opción significa que si se produce un OutOfMemoryError, crea automáticamente un volcado de memoria.
El resultado puede ser precisamente java_pid18452.hprof
¿Por qué ocupan tanto espacio?
El archivo contiene información sobre los objetos almacenados en memoria en el momento del volcado. Si la JVM tenía asignados varios gigabytes de Heap, el .hprof resultante puede ser también enorme.
Por ejemplo, una JVM configurada con -Xmx4096m puede llegar a utilizar aproximadamente 4 GB de Heap.
Un volcado generado cerca del límite de memoria puede, por tanto, ocupar varios gigabytes. Por eso Windows puede tardar bastante incluso en:
- moverlo;
- comprimirlo;
- copiarlo;
- eliminarlo.
¿Se pueden borrar los .hprof?
Sí. Si no estamos investigando un problema de memoria, los archivos java_pidXXXXX.hprof pueden eliminarse. No son:
- código fuente;
- recursos Android;
- archivos necesarios para Gradle;
- dependencias;
- archivos necesarios para crear el APK o AAB.
Eliminar un .hprof no afecta al proyecto Android.
Windows no me deja eliminar el archivo .hprof
Puede ocurrir que Android Studio ya esté cerrado y Windows siga indicando que el archivo está siendo utilizado. Normalmente significa que algún proceso Java sigue activo.
Podemos comprobar si sigue existiendo el PID incluido en el nombre del fichero. Por ejemplo, para java_pid18452.hprof abrimos CMD y ejecutamos:
tasklist | findstr 18452
Si aparece un proceso, podemos comprobar qué aplicación es. Si estamos seguros de que corresponde a Android Studio o Gradle y ya no necesitamos el proceso, podemos terminarlo:
taskkill /PID 18452 /F
Después debería ser posible eliminar el .hprof.
Detener los procesos de Gradle
Aunque cerremos Android Studio, el Gradle Daemon puede continuar ejecutándose. Desde la carpeta raíz del proyecto podemos ejecutar:
gradlew.bat --stop
Esto detiene los procesos Gradle asociados. Después podemos volver a intentar eliminar el fichero.
Cómo saber qué programa está bloqueando el .hprof
Windows dispone de una herramienta muy útil para estos casos. Pulsa Win + R y ejecuta:
resmon
Se abrirá el Monitor de recursos. Entramos en CPU y buscamos la sección Identificadores asociados. Introducimos parte del nombre java_pid18452.hprof.
Windows mostrará qué proceso mantiene abierto el fichero.
Cómo evitar que Android Studio genere automáticamente archivos .hprof
Si no necesitamos los volcados de memoria, podemos deshabilitar su generación. En Android Studio entramos en Help → Edit Custom VM Options
Se abrirá el fichero de opciones de la máquina virtual utilizada por Android Studio. Añadimos:
-XX:-HeapDumpOnOutOfMemoryError
La diferencia entre + y - es importante. -XX:+HeapDumpOnOutOfMemoryError activa los volcados mientras que -XX:-HeapDumpOnOutOfMemoryError los desactiva.
Después guardamos el fichero y reiniciamos completamente Android Studio.
¿Y si el archivo lo genera Gradle?
Android Studio y Gradle utilizan procesos Java diferentes. Por tanto, desactivar los Heap Dumps en Android Studio no garantiza que Gradle deje de generarlos. Si vuelven a aparecer, conviene revisar gradle.properties.
Podemos encontrar una línea similar a:
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
Podemos añadir la opción:
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -XX:-HeapDumpOnOutOfMemoryError
Es importante modificar la línea existente, no crear varias propiedades org.gradle.jvmargs.
Ejemplo con más memoria para Gradle
Si el problema real es que Gradle se está quedando sin memoria, quizá sea más conveniente aumentar el Heap. Por ejemplo:
org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 -XX:-HeapDumpOnOutOfMemoryError
Aquí indicamos -Xmx4096m es decir, un máximo aproximado de 4 GB para el Heap de Gradle. La cantidad adecuada dependerá de la RAM disponible en el ordenador y del tamaño de los proyectos.
Desactivar los .hprof no soluciona el problema de memoria
Este punto es importante. Añadir -XX:-HeapDumpOnOutOfMemoryError evita que se genere el enorme archivo .hprof. Pero si el fichero apareció debido a OutOfMemoryError el problema de memoria continúa existiendo. Simplemente hemos evitado que Java escriba el volcado en disco.
Si aparecen .hprof continuamente, conviene investigar también por qué Android Studio o Gradle se están quedando sin memoria.
Aumentar la memoria disponible para Android Studio
Android Studio permite configurar la memoria máxima que puede utilizar el IDE. Dependiendo de la versión, podemos encontrar esta opción en File → Settings → Appearance & Behavior → System Settings → Memory Settings
Si el equipo dispone de suficiente RAM, aumentar moderadamente la memoria asignada puede reducir los problemas de OutOfMemoryError. Por ejemplo, en un equipo con bastante memoria RAM puede tener sentido trabajar con varios gigabytes asignados al IDE y a Gradle.
No existe, sin embargo, una cifra universalmente correcta: depende del tamaño de los proyectos y de la memoria disponible.
¿Conviene deshabilitar HeapDumpOnOutOfMemoryError?
Depende del uso. Para un equipo de desarrollo donde queremos investigar problemas de memoria, conservar -XX:+HeapDumpOnOutOfMemoryError puede resultar muy útil. Pero en un equipo donde los .hprof aparecen repetidamente, ocupan varios gigabytes y no tenemos intención de analizarlos, puede tener sentido utilizar -XX:-HeapDumpOnOutOfMemoryError especialmente después de comprobar y ajustar la memoria disponible para Android Studio y Gradle.
Configuración práctica
Si aparecen continuamente archivos como java_pid14468.hprof, java_pid18452.hprof, etc. podemos seguir este orden:
- Comprobar si Android Studio o Gradle están teniendo problemas de memoria.
- Ajustar la memoria disponible si el equipo tiene RAM suficiente.
- En Android Studio, añadir -XX:-HeapDumpOnOutOfMemoryError
- Si siguen apareciendo, revisar gradle.properties y añadir también la opción a org.gradle.jvmargs.
- Reiniciar Android Studio.
- Eliminar los .hprof antiguos que ya no necesitemos.
Conclusión
Los archivos java_pidXXXXX.hprof no son archivos misteriosos del proyecto Android. Son volcados de memoria de procesos Java, normalmente creados para facilitar el diagnóstico cuando una JVM tiene problemas de memoria.
Su principal inconveniente es que pueden alcanzar tamaños enormes y llenar rápidamente el disco. Si no necesitamos analizar esos volcados podemos desactivar su generación mediante -XX:-HeapDumpOnOutOfMemoryError tanto en la JVM de Android Studio como, si fuese necesario, en la utilizada por Gradle.
Sin embargo, si estos archivos aparecen con frecuencia, conviene no limitarse a eliminarlos: su generación repetida puede estar avisándonos de que Android Studio o Gradle necesitan más memoria o existe algún proceso consumiendo más Heap del esperado.


No hay comentarios:
Publicar un comentario