java linux memory memory-management pmap

java - ¡Intentando localizar una fuga! ¿Qué significa anon para pmap?



linux memory (4)

He visto ese patrón antes en una fuga de hilo. Si tienes un código que intenta agrupar hilos, pero de algún modo se equivoca y pierde un hilo, obtienes un patrón así en pmap.

Creo que cada bit de memoria es el tamaño de pila mínimo para el hilo, ciertamente no tenía nada que ver con el montón en nuestro caso.
Todavía obtenemos OutOfMemoryErrors cuando alcanzamos los límites del OS, incluso cuando analizamos el montón no se lo sobreutiliza.

Cuando tuvimos un problema como este pmap [pid] | grep -c 12K pmap [pid] | grep -c 12K resultó ser la cantidad de hilos en uso.

Estoy tratando de ubicar mi memoria para un proceso java que se ejecuta en Linux. Alguien sugirió que use pmap -x para ver exactamente lo que está haciendo la memoria.

El resultado es muy largo, pero básicamente una buena parte es una repetición de esto:

00007fbf75f6a000 1016 - - - rwx-- [ anon ] 00007fbf76068000 12 - - - ----- [ anon ]

¿Qué significa esto exactamente? ¿Por qué tengo tantas entradas de este (más de 4000)?


Los bloques de Anon son bloques "grandes" asignados a través de malloc o mmap - vea las páginas de manual. Como tales, no tienen nada que ver con el montón de Java (aparte del hecho de que todo el montón debe almacenarse en ese bloque).

En mi experiencia, las pilas de hilos también usan bloques anónimos. Si ve muchos bloques anónimos que tienen el mismo tamaño, y ese tamaño es de 512k a 4Mb (el ejemplo a continuación se repite más de una docena de veces para un proceso Tomcat que tengo en ejecución), esa es la causa probable. Dependiendo del programa, puede tener hasta algunas docenas de estos; si está viendo miles, significa que tiene un problema con el enhebrado.

b089f000 504K rwx-- [ anon ] b091d000 12K ----- [ anon ] b0920000 504K rwx-- [ anon ] b099e000 12K ----- [ anon ] b09a1000 504K rwx-- [ anon ] b0a1f000 12K ----- [ anon ]

Pero eso deja una pregunta: ¿por qué está utilizando pmap para diagnosticar un problema de memoria de Java?


Use Eclipse MAT (cuando obtiene OutOfMemoryExceptions en el Heap de Java, no en el Heap nativo).