Verificando el uso de memoria por pila usando este comando:
jcmd $pid VM.native_memory summaryPuedo ver que la memoria reservada es diferente de la comprometida.
Thread (reserved=18561KB, committed=1085KB) (thread #18) (stack: reserved=18476KB, committed=1000KB) (malloc=63KB #99) (arena=22KB #35)Reservado es de aproximadamente 1 MB (predeterminado para la pila). Comprometido de hecho es físico reservado. Leí que Java guarda memoria para la pila mientras no se usa totalmente.
Al ejecutar el comando como arriba, puedo ver el uso confirmado.
¿Qué hace java/SO para reservar esta memoria sin ser contada por las estadísticas de RSS (medida de memoria de Linux)?
¿Podría otro proceso usar esta memoria debido a que no está reservada físicamente?
Nota: jdk11 SO Linux
¿Qué hace java/SO para reservar esta memoria sin ser contada por las estadísticas de RSS (medida de memoria de Linux)?
Este tipo de "reserva" se basa en el concepto de Memoria Virtual . La JVM llama a mmap para reservar un espacio de direcciones. Inicialmente, estas direcciones son solo números que no están respaldados por páginas físicas. En el primer acceso a una página virtual, ocurre una falla de página y el sistema operativo lo maneja asignando el almacenamiento de respaldo (RAM física o un espacio de intercambio).
¿Podría otro proceso usar esta memoria debido a que no está reservada físicamente?
En resumen, sí. Una respuesta más larga: depende de la configuración del sistema operativo, específicamente, vm.overcommit_memory y vm.overcommit_ratio sysctls. La configuración predeterminada permite el compromiso excesivo, es decir, es posible asignar más memoria virtual que la memoria RAM física disponible + intercambio (porque las aplicaciones a menudo no usan toda la memoria virtual que reservan).
Debe comprender que en cualquier sistema operativo moderno, la "memoria" es virtual.
La memoria "reservada" es en realidad solo un espacio de direcciones que se asigna a un uso particular. Lo que esto significa es principalmente un ajuste de las estructuras de datos que rastrean el uso del espacio de direcciones.
La memoria "comprometida" es un poco más ondulada. En su mayoría, solo significa que la memoria física que podría necesitarse se rastrea contra alguna noción de la confirmación máxima que está disponible. En general, no existe la noción de que la RAM física real se asigna de alguna manera al proceso en este punto; en el mejor de los casos, se puede reservar espacio para el archivo de paginación.
(Si desea una RAM real segura, debe "fijar" las páginas comprometidas en la memoria física).
La RAM real no se asigna hasta que se toca una página; e incluso después de eso, puede ser quitado nuevamente, por la dinámica de la memoria virtual paginada, en parte dependiendo de qué más esté sucediendo en el hardware.