
En un Redhat CentOS 6.4 solo se ejecutan unos pocos procesos, utilizando aproximadamente 3 GB de RAM (el sistema tiene 12 GB disponibles). Uno de los procesos es un Servidor WSO2ESB (java), lo iniciamos con esos parámetros:
-Xms2048m -Xmx3072m
Después de un tiempo obtenemos una excepción OutOfMemory, peroel proceso java (WSO2ESB) ni siquiera usa sus 3GB. En jconsole también puede ver que esos parámetros se configuraron correctamente (Linux Server tiene aproximadamente 9 GB de RAM libre en este momento)
¿Linux no nos da los 3 GBytes de RAM configurados?
En exactamente la misma instalación de Windows: el proceso de Java puede usar sus 3 GB de RAM sin ningún problema.
Captura de pantalla de jconsole que muestra el uso de memoria dinámica solo entre 0,3 y 1,0 GB. En el momento de la excepción OutOfMemory, la memoria del montón estaba en 0,5 GB, pero el proceso tendría 3 GB para trabajar, pero no es así...
EDITAR: registro agregado del proceso de Java:
java.lang.OutOfMemoryError: unable to create new native thread
EDITAR2: salida -m gratuita agregada:
Respuesta1
Resolví el problema. wso2esb estaba usando más de 1000 subprocesos. Pero en Linux, la cantidad predeterminada de subprocesos que un usuario puede usar está establecida en 1024. Tuve que aumentar el límite para mi usuario, ahora todo funciona bien.
Para hacerlo: abra /etc/security/limits.conf y agregue las siguientes dos líneas para su usuario:
myuser soft nproc 8192
myuser hard nproc 8192
Respuesta2
Java tiene varias generaciones de espacio de montón, generación permanente nueva y antigua.
Si configura Xmx muy alto, se usa para el montón, e incluso si no usa el montón completo, puede quedarse sin memoria. Esto suele suceder si te quedas sin espacio en PermGen.
La generación permanente de montón se utiliza para almacenar el grupo de cadenas y varios metadatos requeridos por JVM relacionados con clases, métodos y otras primitivas de Java. El espacio permanente suele ser de 64 MB, por lo que si tienes muchas clases o cadenas grandes puedes quedarte sin él.
Intente aumentar el tamaño de permgen agregando:
-XX:MaxPermSize=256m
a sus opciones de inicio de Java.
Respuesta3
¿Cuál es el tamaño del segmento de datos para el montón -Xms2048m -Xmx3072m
?
el tamaño del segmento de datos debe corresponder al tamaño máximo del montón (que es 3072 m en este caso). Por lo tanto, el tamaño del segmento de datos debe establecerse al menos 3221225472
(en Bytes 3*1024*1024*1024 = 3 GB)