Estoy intentando configurar un servidor de mensajería altamente concurrente y parece utilizar mucha memoria. Actualmente el sistema operativo de nuestro servidor es Ubuntu y el software del servidor está escrito en Java. Bajo carga, nos quedamos sin memoria, pero solo se usa el 70% de mis 8 GB de RAM.
¿Cómo puedo asignar más memoria a mi proceso Java?
Respuesta1
Por lo que puedo decir, hay cuatro posibilidades:
Ubuntu no limita la memoria por proceso de forma predeterminada, pero hay formas de configurar esos límites. La forma más sencilla de saber qué se ha hecho (si es que se ha hecho algo) sería consultar a la persona que administra el servidor.
Si estás en un VPS y no en un servidor real, puede haber un problema con la configuración de la VM.
No sé exactamente cómo funciona Java, pero C restringe la memoria disponible para la pila al compilar. En este caso, puede indicarle al compilador que aumente el tamaño de la pila o que mueva matrices más grandes al montón.
Si su sistema operativo es de 32 bits, la memoria disponible por proceso está limitada (entre 2 GB y 4 GB). Si su servidor tiene una CPU de 64 bits, eso se puede solucionar fácilmente instalando un sistema operativo de 64 bits.
La posibilidad 4 es bastante fácil de descartar. Para verificar si es 1, 2 o 3, puedes compilar lo siguiente con gcc (o escribir el equivalente en Java):
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
long bytes = atol(argv[1]), counter, *pointer, words = bytes / sizeof(long);
// try to allocate memory
if ((pointer = malloc(bytes)) == NULL)
{
puts("Could not allocate memory");
exit(1);
}
// play with memory, so compiler won't optimize allocation out
for(counter = 0; counter < words; counter++)
pointer[counter] = counter;
exit(0);
}
y ejecútelo con la cantidad de memoria que desea asignar como opción de línea de comandos.
Debería poder asignar toda la memoria que se informa como libre o en caché. Si puede, descarta la posibilidad 1 y posiblemente la 2.
Respuesta2
La memoria más grande utilizada por los procesos de Java es el montón, donde se almacenan la mayoría de los objetos de Java. De forma predeterminada, está limitado a 1 GB o una fracción de la memoria presente. Cuando se queda sin espacio en el montón, aparece una excepción de falta de memoria de Java. Puede aumentar (o disminuir) el tamaño del montón de una JVM utilizando la opción -Xmx. p.ej:
java -Xmx=2048m ...
Si está utilizando una JVM de 32 bits, no puede configurarla de manera confiable en más de ~2,5 a 3 GB. Debe cambiar a una JVM de 64 bits para evitar esta limitación.