Foros del Web » Programación para mayores de 30 ;) » Java »

Problema de memoria

Estas en el tema de Problema de memoria en el foro de Java en Foros del Web. Hola!, tengo programado un servidor de sockets en java, el cual he subido a mi VPS (Servidor virtual) el cual tiene 512 Mbs contratados, esto ...
  #1 (permalink)  
Antiguo 14/07/2009, 02:31
Avatar de sfx4ever  
Fecha de Ingreso: noviembre-2003
Ubicación: aqui
Mensajes: 384
Antigüedad: 20 años, 5 meses
Puntos: 2
Problema de memoria

Hola!, tengo programado un servidor de sockets en java, el cual he subido a mi VPS (Servidor virtual) el cual tiene 512 Mbs contratados, esto es lo que me pone en el Plesk (con mi aplicación java cerrada):
Parameter: slmmemorylimit
Current use: 212
Soft Limit: 256
Hard Limit: 512 Mb

Y este es el log de mi servidor, ejecutado con java -verbosegc servidor
Cita:

[GC 5011K->4139K(7820K), 0.0004600 secs]
[GC 5035K->4182K(7820K), 0.0004220 secs]
[GC 5078K->4229K(7820K), 0.0005250 secs]
[GC 5125K->4276K(7820K), 0.0005020 secs]
[GC 5172K->4317K(7820K), 0.0004950 secs]
[GC 5213K->4365K(7820K), 0.0004790 secs]
[GC 5261K->4412K(7820K), 0.0005070 secs]
[GC 5308K->4448K(7820K), 0.0005050 secs]
[GC 5344K->4491K(7820K), 0.0004700 secs]
[GC 5387K->4543K(7820K), 0.0004770 secs]
[GC 5439K->4590K(7820K), 0.0005190 secs]
[GC 5486K->4637K(7820K), 0.0004870 secs]
[GC 5533K->4684K(7820K), 0.0005590 secs]
[GC 5580K->4731K(7820K), 0.0005110 secs]
[GC 5627K->4768K(7820K), 0.0004520 secs]
[GC 5664K->4805K(7820K), 0.0004660 secs]
[GC 5701K->4853K(7820K), 0.0004830 secs]
[GC 5749K->4895K(7820K), 0.0005400 secs]
[GC 5791K->4942K(7820K), 0.0004660 secs]
[GC 5838K->4984K(7820K), 0.0005770 secs]
[GC 5880K->5026K(7820K), 0.0004540 secs]
[GC 5922K->5063K(7820K), 0.0005150 secs]
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Se que debo usar los parametros -xmx y -xms para los valores maximos e iniciales para la heap de java, pero no estoy muy seguro de que valores ponerle. Agredeceria que me echarais una mano con estos 2 valores a partir de los datos de mi servidor.

GRACIAS !
  #2 (permalink)  
Antiguo 14/07/2009, 03:11
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Problema de memoria

Los 512 supongo que son para toda tu instancia virtual, así que la memoria que tengas libre para la JVM depende de lo que te consuma el sistema operativo y el resto de cosas que tengas metidas. Además, la memoria a asignar a tu programa depende de lo que consuma tu programa, no solo de la que tengas libre.

Como mucho yo probaría con 128 o 256 megas para la JVM. Seguramente ahora tengas asignadas por defecto 64, que en las ultimas versiones de Java era el valor por defecto.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 14/07/2009, 03:29
Avatar de sfx4ever  
Fecha de Ingreso: noviembre-2003
Ubicación: aqui
Mensajes: 384
Antigüedad: 20 años, 5 meses
Puntos: 2
Respuesta: Problema de memoria

gracias GreenEyed por tu rápida respuesta ;D
Según las estadisticas del Plesk tengo 512-212= unos 300Mb libres (esto depende de la carga del server, porque tambien tiene un apache, y mysql con un sitio web activo), y creo haber leido por ahi que recomiendan especificar mas o menos un 80% de esta memoria libre, por lo que CREO que 256 podria encajar..

¿debo poner la misma cantidad en los dos parametros?
osea:
Cita:
java -xmx256m -xms256m servidor
voy a probarlo y os cuento

GRACIAS!
  #4 (permalink)  
Antiguo 14/07/2009, 05:39
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Problema de memoria

No es obligatorio poner lo mismo en los dos. En algunas circunstancias se recomienda, si ya sabes la memoria que va a necesitar, para que no "pierda el tiempo" reservándola poco a poco. Pero si no sabes cuanta memoria vas a necesitar, puedes ponerle un valor inicial menor 64-128, y así si no usas los 256 pueden quedarte libres algunos megas para otros procesos.

Por cierto, por si no te has dado cuenta todavía, los 256 son para la memoria de tus programas corriendo en la JVM, pero no cuenta la memoria que necesita la propia JVM y, si no recuerdo mal, tampoco cuentan en esos 256 la memoria necesaria para el stack de los procesos. Así que no esperes hacer un top y ver que solo consume 256 Mb.

En realidad a mi me salen alrededor de unos 100Mb más por JVM. Ahora mismo unos servidores que tengo con 256 de memoria están ocupando en el S.O. unos 310-358Mb.

Para que lo tengas en cuenta.

S!

PD: Por si alguna vez te pasa. JVM + usar memoria swap = muy malas noticias. La JVM quiere RAM de verdad
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 16/07/2009, 14:29
Avatar de sfx4ever  
Fecha de Ingreso: noviembre-2003
Ubicación: aqui
Mensajes: 384
Antigüedad: 20 años, 5 meses
Puntos: 2
Respuesta: Problema de memoria

ufff, sigo sin poder solucionar este problema...

Le he puesto a mi código esto:

Cita:
Runtime rt = Runtime.getRuntime();
System.out.println(" Memoria libre: " + rt.freeMemory());
System.out.println(" Memoria total: " + rt.totalMemory());
Y este es el log que escribe justo antes de petar:

Cita:
Thread[Thread-4,4,main] - Procesamos conexion
Memoria libre: 65124648
Memoria total: 66650112
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Java HotSpot(TM) Client VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated
Lo estoy ejecutando con esto:

Cita:
nohup java -verbosegc -Xmx256m -Xms64m servidor > logfile.txt
Si mis calculos no son erroneos, 66650112 (mem total) - 65124648 = 1525464 bytes que utiliza mi aplicación, osea, 1 Mega de nada... ¿por que se me desborda entonces?

¿conoceis alguna otra forma de poder ver que uso hace mi programa de la memoria? ¿o alguna otra forma para loguear el error con más información?
Supongo que podria capturar la excepción java.lang.OutOfMemoryError, pero no tengo muy claro como hacerlo... ¿alguna idea?


GRACIAS!
  #6 (permalink)  
Antiguo 17/07/2009, 00:12
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Problema de memoria

Por lo que pone aquí: http://blog.krecan.net/2008/03/24/he...ing-my-tomcat/

El problema es que no tienes suficiente memoria en Linux para todo lo que tienes, y Linux cuando se queda sin memoria y sin swap mata procesos, que es el SIGTERM que recibe la JVM. Es decir, no es que la JVM se este quedando sin la memoria que tiene reservada, es que Linux se esta quedando sin memoria para darle a la JVM (y al resto de cosas que tengas).

Da la impresion que tu maquina Linux no tiene RAM suficiente para correr el programa en Java y hacer todo lo demas. Prueba a ponerle 64MB de memoria máxima y mínima, a ver si así no mosquea al S.O.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:29.