Liberando memoria en Java y numero de procesos generados

paulados
10 de Junio del 2005
Hola, la pregunta que hago es bastante explícita y concreta, y no se si alguien podrá responderme, pero es que soy incapaz de entenderlo.
Resulta que programo Java bajo linux, y usando JNI (java usando una librería de C) me di cuenta de que mi programa no liberaba bien la memoria (usando top, el tanto por ciento de memoria del programa no paraba de crecer).
Desesperada, me dispuse a probar un programa en java (nada de C) que trata imágenes, y comprobé que igualmente aumentaba el tanto por ciento de memoria que utilizaba (aunque lentamente), cuando se supone que el propio Java se encarga de liberarla.
Como conclusión, mi duda es, ¿alguien se ha molestado alguna vez en comprobar si Java libera realmente bien la memoria o ha tenido problemas con eso (yo uso procesamiento de imágenes en tiempo real y el uso de la memoria se nota más que en otras aplicaciones)?

Aparte de este asunto, al ejecutar top he descubierto tambien que al ejecutar una clase de Java, no se abre un solo proceso, sino que hasta con el más sencillo de los procesos que he probado (main y un tiempo de espera usando Thread.sleep() ) se creaban por lo menos 6 procesos hijos. ¿A que se deben, o por que salen? ¿se crea un proceso por clase llamada?

Muchas gracias por adelantado,
Paulados.

drjustice
10 de Junio del 2005
Hola paulados:
con respecto a liberar memoria, Java se encargaría. Pero igualmente puedes llamar al método finalize() para finalizar un objeto.
Tambien puedes llamar al garbage collector usando System.gc()
Espero que te sirva.
Slds

rubece
10 de Junio del 2005
Java sacrifica eficiencia en favor de portabilidad al ser un lenguaje que es interpretado y que habiendo un interprete implementeado en un sistema no hace falta más para que se pueda ejecutar. El lema de Java es compila una vez y ejecuta siempre o algo así. Por tanto el uso de memoria de Java es bastante eficiente. Además en Java no hace falta liberar memoria porque el recolector de basura de Java se encarga de ello. Pero el problema es que momentos se ejecuta el recolector de basura. Yo no lo sé. No sé si alguíen te lo podrá decir. Se supone que la vida de un objeto acaba se debería liberar la memoria que usa pero puede ser más tarde cuando se pida memoria y no haya o simplemente cuando se acabe el programa se libera toda la memoria que se ha reservado. Si esa memoria reservada Java no la libera, entonces efectivamente hay un problema. Bueno en cuanto a lo de los procesos no te se me ocurre nada. Que te vaya bien. Hasta luego

chuidiang
10 de Junio del 2005
Hola:

java en principio libera bien la memoria. Para que se libere, no debe haber nadie referenciando a dicho objeto.

Por un lado debes asegurarte que no hay ninguna variable que apunte a esos objetos (por ejemplo, listas que cada vez tengan más elementos, etc).

Un segundo problema son las "suscripciones a cosas" (llamadas a metodos add*Listeners() y demas). Para que la memoria usado por estos se libere, debes "dessuscribirte" llamando al remove*Listener() correspondiente.

Por otro lado, las ventanas tienen un tratamiento especial. En el momento que haces una ventana visible, la ventana ya no se libera porque de alguna forma se ha "suscrito" a eventos de raton y demás. Para que la ventana se "desuscriba" y realmente se libere, es necesario llamar a su metodo dispose().

En fin, que con clases tontas no tienes que preocuparte de la memoria, porque se libera bien, pero con aplicaciones complejas, debes ser cuidadosa e ir llamando a remove*Listeners(), dispose(), etc, etc.

Se buena.

paulados
10 de Junio del 2005
Muchas gracias a todos por los consejos y las explicaciones, voy a ponerme manos a la obra a ver si consigo que el programa no se me cuelgue.
Chiaito.
Paulados.