memoria
que tal
soy nuevo en el foro y voy iniciando a programar en j2ee, tengo una duda, haber si alguien me puede ayudar
estoy haciendo una aplicacion web para un proyecto de la universidad, la aplicacion esta checando una base de datos en una pc que uso como servidor, estoy usando jsp y glassfish como servidor de aplicaciones, el asunto es que cuando se conectan varios usuarios a la vez veo que la memoria que usa java va aumentando, eso lo veo en el administrador de tareas de windows, pero cuando se cierran todas las paginas, la memoria nunca se libera, probe abriendo la pagina como con 40 usuarios y la memoria se fue como a 550 mb, la pc solo tiene 1 gb de memoria, asi que a los 40 ya no me dejo abrir mas paginas, y aunque las cerre todas, el proceso de java no suelta esa memoria,
que puedo hacer para que libere la memoria como vaya dejandola de usar??
gracias
- Inicie sesión o regístrese para enviar comentarios
Básicamente tienes que
Básicamente tienes que liberar recursos que estes almacenando. Es IMPOSIBLE decirte: "quita el objeto x que guardas en el arreglo del java Inicio.java en la linea 24" porque pues ni idea si tienes objetos que guardes en arreglos en algun Java que se llame Inicio que tenga una linea 24, per sí, tienes que revisar tu aplicación para asegurarte que no estes guardando datos que despuès no liberas ( ja, seguro esto ya lo sabías )
Algo qeu te puede ayudar a revisar esto es el programa Java VisualVM, abrelo ( está en el mismo directorio donde esta javac, o jar ) y revisa tu proceso, este progama te ayuda a ver como se está usando la memoria.
No olvides escribir tus resultados acá en el foro y si lo resuelves como lo hiciste e incluye algunos screenshots, eso siempre ayuda a otros.
Voy a sonar medio mala onda,
Voy a sonar medio mala onda, pero estas seguro que es la memoria lo que esta aumentando? talves es el procesador, no se cuantos recursos le estes destinando a la jvm del servidor de aplicaciones pero nunca usara mas que la que se le especifique o que venga por default para glassfish.
Y en el caso que te acabes la memoria de la jvm lanzaria una excepcion
Solo para asegurar que se
Solo para asegurar que se trata de memoria y que, el liberar recursos puede ayudar.
Implementa un session Listener a tu aplicacion y, cada que una sesion muera... elimina TODO...todo de session, es decir.
Libera cualquier recurso que ese usuario tenga vinculado.
Loggera inicio y termino de sesion, al menos así verás que las sesiones estan "muriendo adecuadamente"
Si con esto no baja, el problema está en otro lado.
Esto te puede servir.
Nos vas contando.... este tipo de problemas es de mucho, probar y probar.
RuGI
+1 por el session listener (
+1 por el session listener ( ni me acordaba que existía )
sigue igual
que tal gracias por las respuestas
si se trata de memoria, con 40 usuarios el procesador llego a un tope de 45% de uso, solo uso los objetos necesarios de dbc ya saben connection, statement, resulset etc. y los libero asignandoles el valor de null despues de usarlos,tengo entendido que asi se liberan, no uso ningun otro objeto, solo algunas variables locales
lo raro es que mientras hay algun usuario conectado el consumo de memoria sigue creciendo, y cuando no hay nadie se queda en el limite que haya alcanzado y ahi practicamente ya no tiene variacion o muy poca
voy a probar las otras opciones que me sugieren y les digo como me fue
saludos
Pues, si el cuello de botella
Pues, si el cuello de botella son esos objetos que mencionas.... estoy casi seguro que con lo de la limpieza cada que una session muere se mejora la cosa.
Solo asegurate de no tener session de tiempo de vida muy largos... creo el promedio es de 20 minutos
- alguien que tenga otro dato? -
Aun asi, el siguiente punto es.... estan optimizados tus Beans/Pojos? digo.... aun cuando esto se solucione, si tu aplicacion crece, volveras a toparte con el problema... llega el momento de que cuides cada byte como oro puro... almacenas edades en int's? montos-pequeños en long's? etc, etc-
Bueno, pero, primero A y luego B.... a limpiar esas sesiones que mueren para que vayan al valhalla ligeras ... como debe de ser!!!
Saludos!!!
---
RuGI
mal
estuve checando el link de adictos al trabajo sobre lo del session listener y veo que ando muyyy mal jajaja, como les digo voy empezando y lo que hice fue incrustar codigo java dentro del codigo xhtml, no manejo servlets lo mas parecido son otras paginas html con codigo java incrustrado a las que mando llamar con XMLHttpRequest(), en pocas palabras lo hice como dios me dio a entender, la cosa es que funciona pero veo que estoy muy lejos de como deberia de hacerce correctamente, y veo que problablemente van a ir saliendo detalles, asi que parece que tendre que empezar de nuevo
algun tutorial o pagina que recomienden para empezar??
gracias
close
solo uso los objetos necesarios de dbc ya saben connection, statement, resulset etc. y los libero asignandoles el valor de null despues de usarlos,tengo entendido que asi se liberan
Pero cierras esos recursos? Si ya no usas una conexión, hay que darle
, igual a un ResultSet, no recuerdo si al PreparedStatement o Statement también... si no los cierras y solamente los apuntas a null, pueden estarse quedando en memoria porque internamente el driver de JDBC esté haciendo referencia a ellos (a la conexión, y la conexión tiene referencia a todos los objetos que ha creado y que no se han cerrado).
No suelo usar muchos
No suelo usar muchos recursos, pero cuando los uso los libero con null. Oh, bueno me acordé :)
@ezamudio, si, tabién al prepared statement y al statement, de preferencia en el orden inverso en el que se abrieron:
jejej recorde que el catch de
jejej recorde que el catch de esas operaciones son .... como decirlo.... un acto de anidamiento obligado :P
A mi me gusta el if try
A mi me gusta el
construct y para mí es la única parte donde me permito poner un if sin llaves:
:)
Recursos
Un buen tutorial sobre Servlets y JSP lo encuentras en
Para la parte de liberación de recursos, aquí se encuentra el código universal: (mucho código pero es la forma que realmente se asegura de no dejar nada abierto). Las asignaciones a null, las utiliza no tanto para liberar los recursos si no como banderas.
ando grave, soy novata y
ando grave, soy novata y tengo una base de datos, tengo que relacionar Estado, municipio y paRRoquia. como les agino codigo?
un estado tiene varios municipio. un municipio tiene varias parroquias.... como hago?
para la pantalla los tengo en un Jlist pero no se como asignarles codigo a los estados, municipios y parroquias. alguien por favor ayudeme
@jane Respuesta: Con
@jane Respuesta: Con código.
Que es lo que llevas?
a ver.. por ejemplo: cuando
a ver.. por ejemplo:
cuando elija
Estado municipio parroquia
mendoza la paz villa linda
como los relaciono....
Con código... ( creo que esto
Con código... ( creo que esto caerá en un loop infinito ¬¬ )
SEPOMEX
El Servicio Postal Mexicano publica una lista de todos los códigos postales, relacionados por población, colonia, ciudad, municipio/delegación y estado. Con eso puedes obtener toda esa info; solamente creo que viene en formato de Excel, es cosa de aplicarle unas transformaciones para guardar los datos de forma ordenada en creo que 4 tablas de una base de datos y ponerle un API en frente para obtener datos de dos formas:
De grande a chico, ir obteniendo listas de pertenencia (seleccionas Estado y te da los municipios de ese estado; seleccionas municipio y te da las poblaciones; seleccionas la población y te da el CP).
De chico a grande (pones el CP y te rellena todo lo demás, aunque a veces un CP abarca más de 1 población en ese caso hay que mostrar un combo para que seleccionen la población correcta).
Hola Jane..... Sigue la
Hola Jane.....
Sigue la recomendación de Ezamudio , solo es cuestion de que te descargues la informacion de SEPOMES, o me parece que software guru ya daba ese servicio.
Me ha llamado la atención el "domio del problema" de tu aplicación, es tarea escolar? o estas desarrollando para alguna parroquia
Saludos!!
reduccion de memoria
parece que el problema ya quedo resuelto, tenia una fuga de memoria, porque pensaba que con solo cerrar la conexion ya era suficiente.
asi que lo que tuve que hacer fue ademas de cerrar el connection, tambien cerre los statement y los resulset y depues de cerrar los 3 les asigne el valor de null para que pudieran ser recolectados por el gc, ademas cambie de glassfish a tomcat 7 con todo eso tuve una reduccion del consumo de memoria de 90% aprox. el problema que surgio con eso es que tomcat no me daba abasto, asi que aumente el heap hasta 1024 mb y con eso funciona mas o menos con 80 usuarios simultaneos, ahora lo que tengo que ver es como mejorar el rendimiento porque cuando tengo mas de 50 usuarios simultaneos aveces me muestra algunos datos y aveces no, tal vez eso se solucionaria si usara un servidor de verdad y no una pc tratando de hacer el trabajo de un servidor jeje
No, la funcionalidad seria lo mismo
Muchas personas creen que sus aplicaciones funcionan mal por ejecutarlas en una PC normal, cosa que no es verdad. Un servidor de a devis solo te ayuda a que tu aplicacion se ejecute mejor en cuestiones de desempeño pero nunca va a solucionarte problemas de codigo. Si tu notas que a veces pinta datos y a veces no pues es seguro que es un error en tu codigo que no soluciona un servidor con hardware ni software super extra robustos.
Yo te recomiendo que hagas trazas de los datos que estas manejando es decir: con n logger o con cualquier cosa (incluso con puro prntln) que pueda pintarte los datos al obtenerlos, procesarlos y escribirlos (lo que hagas con ese dato) si comienzas a hacer aplicaciones esto te ayudará como no tienes idea para identificar donde pierdes informacion, recuerda que es importante que indiques el nombre de la clase y el metodo donde colocaste tu punto de traza
Algo sencillo seria:
Esa es la idea, puedes escribir la traza en un archivo, en la consola... lo que sea, eso a mi me sirve como no tiees idea