Buenas a todos los foreros/as.
Mi duda está en relación al recolector de basura de java. Si por ejemplo necesito calcular 3 millones de posibilidades de cualquier evento, java da un problema de heap space. Según me han comentado se puede solucionar aumentando la cantidad de memoria de la máquina virtual, pero es mas eficiente utilizar bien el recolector de basura. :)
Entonces, si quiero que no de ese problema, ¿debo de escribir a disco duro, y entonces, en el momento que no existan referencias a ese array (por ejemplo), el recolector de basura libera memoria?.
No recuerdo la política de llamada al recolector, pero puedes llamarlo cuando quieras.
System.gc()
http://cdsmith.twu.net/professional/java/myths/gc.html
Gracias por la respuesta, voy a investigar un poco.
Lo que mola es llamar a System.gc() y a continuación tener 1 segundo de parada del programa. Me encanta java, menos cuando hay que hacer algo rápido y bien.
Se me ocurre una cosa: ¿Y si creas un hilo exclusivamente para el recolector a poca prioridad?. ¿Se seguiría parando el programa?.
Ten en cuenta que todo lo que se pueda hacer ya lo ha hecho sun. Aparte que el gc tiene que recorrer todo el grafo comprobar y si hay referencias que se apuntan mutuamente y permanecen en memoria, etc, etc. Es algo pesadísimo.
Ethiel, a veces no hay más remedio que "darle" más espacio al heap de Java. Por defecto el máximo está en 64MB, lo que puede ser poco para segun qué aplicación:
http://java.sun.com/docs/hotspot/ism.html
Yo mismo he tenido que ampliar el heap inicial máximo para alguna práctica de algorítmica de la universidad..
Cita de: "ethernet"Lo que mola es llamar a System.gc() y a continuación tener 1 segundo de parada del programa. Me encanta java, menos cuando hay que hacer algo rápido y bien.
Joer, q cuchillada... he estado riendome un buen rato (mi chica me ha llamado superfriki por reirme con esas cosas y lo q es peor, luego contarselo a modo de chiste :P).
Perdón por el off topic
La idea del thread para la llamada al recolector de basura no es mala, pero para que funcione bien creo que habria que sincronizar los threads (el principal de tu programa y el thread que llama al recolector). De esta forma el thread principal dormiria automaticamente mientras el segundo trabaja, y no se bloquearia.
Bufff.. Veo que el tema del recolector da mucho de si... Por el momento, no ampliaré la heap, para obligarme a optimizar la memoria. (Así aprendo mas a programar en java, que me encannnnnta :).
Muchas gracias por la ayuda y los comentarios.
Saludos.
Y sí, por reírnos de éstas cosas es para que nuestras novias nos llamen frikis. :)