Tengo una aplicación JBoss ejecutándose en una plataforma Linux, tiene un resultado superior como el siguiente (en realidad, no son datos precisos):
PID USER PR NI VIRT RES SHR S %CPU %MEM CODE DATA TIME+ COMMAND
1379 root 16 0 9.7g 1.6g 1980 S 0.7 1.3 36 9.7g 0:11.03 java
Tiene 1,6 g de memoria física en total y 9,7 g de parte de DATOS. en realidad, el tamaño del montón es de ~128 m según lo configurado con JVM. Mi pregunta es ¿qué se almacena en la parte de DATOS para la aplicación Java? ¿Cualquier pista? ¿Y cómo podría optimizarlo?
gracias, emre
Respuesta1
DATA
significa memoria asignada por la aplicación usando brk(2)
, es decir, extendiendo el segmento de datos.
Java tiene muchas cosas diferentes que colocará en el segmento de datos:
- el montón
- Cualquier memoria asignada por la capa de tiempo de ejecución nativa (código que usa la
native
palabra clave) - Cualquier memoria asignada por DLL/bibliotecas compartidas que cargue desde Java usando JNI/JNA
- Memoria donde el código de bytes se carga, interpreta y compila mediante el JIT (caché de código)
- Estructuras de memoria utilizadas por el GC y otro código de soporte en tiempo de ejecución
- La pila
Tenga en cuenta que darle a un programa un montón de 128 MB asignará más que eso porque Java también creará algunas estructuras para administrar el montón que no forman parte de él. Entonces, 128 MB significa que tendrá 128 MB en los que podrá asignar objetos Java.
Respuesta2
Esta es la cantidad de memoria física dedicada a otro código que no sea ejecutable, también conocido como tamaño de "conjunto residente de datos" o DRS. Generalmente, puede consultar una página del manual que describe todas las columnas en detalle. Para obtener una página de manual, escriba man top
.