2009-09-25 15 views
23

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.¡Intentando localizar una fuga! ¿Qué significa anon para pmap?

La salida es muy largo, pero, básicamente, una buena parte de la misma es una repetición de esto:

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

Lo que quiere decir esto exactamente? ¿Por qué tengo tantas entradas de este (más de 4000)?

Respuesta

28

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é utiliza pmap para diagnosticar un problema de memoria de Java?

+0

> ¿Por qué está utilizando pmap para diagnosticar un problema de memoria de Java? Tenemos un proceso de Java con un montón establecido en un máximo de 256 MB, pero su memoria RSS es de 8,9 GB. ¿Qué otra herramienta podemos usar para diagnosticar esto? – Opher

+1

@Opher - seguro, tiene sentido para usted. ¿Pero eres el OP? (y en caso afirmativo, ¿por qué estás comentando 8 años después?). De la pregunta original, no estaba claro si el OP sabía lo que estaba buscando. – kdgregory

+1

Y como sugerencia: si observa una disparidad tal entre el tamaño de almacenamiento dinámico configurado y el RSS, busque archivos mapeados en memoria o búferes directos. Verá ese comportamiento, por ejemplo, desde un servidor Kafka o SOLR, y es normal. – kdgregory

3

Ver this partthis part de System Performance Tuning para la memoria anónima.

+0

Eso le indica cómo se administran las asignaciones anónimas, no de qué se trata. Aunque el enlace general es bastante bueno. – kdgregory

2

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

0

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, sin duda 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 está sobreasignado.

Cuando tuvimos un problema como este pmap [pid] | grep -c 12K resultó ser el número de subprocesos en uso.