Tamaño de memoria virtual de Java mayor que el solicitado (o requerido)

Este artículo ofrece un buen análisis del problema: ¿Por qué mi proceso Java consume más memoria que Xmx? Y su autor ofrece esta fórmula aproximada:

Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

Pero además de la memoria consumida por su aplicación, la JVM en sí misma también necesita algo de espacio. - Recolección de basura. - Optimización JIT. - Asignaciones fuera del montón. - Código JNI. - Metaspace.

Pero tenga cuidado, ya que puede depender tanto de la plataforma como del proveedor / versión de JVM.

Respuesta 1

Esto podría deberse al cambio en el comportamiento de malloc en glibc 2.10+, donde malloc ahora crea agrupaciones de memoria por subproceso (arenas). El tamaño de la arena en 64 bits es de 64 MB. Después de usar 8 arenas en 64 bits, malloc establece el número de arenas en number_of_cpus * 8. Entonces, si está utilizando una máquina con muchos núcleos de procesador, el tamaño virtual se establece en una gran cantidad muy rápidamente, aunque la memoria real utilizado (tamaño residente) es mucho más pequeño.

Como está viendo un tamaño virtual superior de 12 GB, probablemente esté utilizando una máquina de 64 bits con 24 núcleos o hilos HW, lo que da 24 * 8 * 64 MB = 12 GB. La cantidad de memoria virtual asignada varía con la cantidad de núcleos, y la cantidad cambiará dependiendo de la cantidad de núcleos en la máquina en la que se envíe su trabajo para ejecutarse, por lo que esta verificación no tiene sentido.

Si está utilizando hadoop o yarn y recibe la advertencia, configure yarn.nodemanager.vmem-check-enabledyarn-site.xml en false.

Referencias

Ver # 6 en esta página:

http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas/

que enlaza con una discusión más profunda en esta página:

https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage

Tenga en cuenta que esto ya está parcialmente respondido en esta página de stackoverflow:

El contenedor se está ejecutando más allá de los límites de memoria.

Respuesta: 2

Del libro de texto "RESTful Java with JAX-RS" podemos leer: Si nuestro servidor de aplicaciones es compatible con JAX-RS o, en otras palabras, está estrechamente integrado con JAX-R, declare nuestra clase ShoppingApplication como ...

Estaba buscando una manera de comparar dos objetos JSONObjects además de usar JSONObject.toString (). Equals (JSONObject.toString ()) y encontré este método similar, pero es muy vago sobre lo que compara ...

Tengo un archivo JAR que necesito convertir a un paquete OSGi. No tengo el código fuente original para el archivo JAR. Intenté usar las respuestas de: ¿Cómo crear un paquete OSGi desde la biblioteca jar? ...

Actualmente estoy mirando la biblioteca de Javaslang y estoy tratando de convertir parte de mi código a Javaslang. Actualmente tengo este bit de código que es puro laberinto Java Cell [] []; // desde la entrada Mapa <Celda, ...