none
Liberar Window de la memoria RRS feed

  • Pregunta

  • Hola disculpen si es una pregunta tonta, estoy intentando optimizar el uso de memoria en mi aplicación y he notado que al eliminar ventanas no se liberan de la memoria, ni aún cuando uso el garbage collector.

    Lo que hago es usar .Close() que tengo entendido que incluso quita a la ventana de la memoria (corrijanme si me equivoco), pero he notado que al darle close, la memoria baja lo mismo que si simplemente minimizo la ventana (es decir sólo baja el costo de memoria por dibujar la ventana), lo que me hace pensar que no se ha liberado bien... (según yo he anulado todas las referencias a la ventana).

    No se si el hecho de ke la clase tenga una variable estatica afecte o.o? pero ps es solo un booleano, y si son como 1 o 2 MB de memoria, que se van acumulando cada vez si se abre y se cierra la ventana, por eso quiero corregirlo.

    Alguien me podría orientar un poco? Gracias

    martes, 20 de julio de 2010 6:39

Respuestas

  • Hola Juanfra.

    El Garbage collector es un tema que puede llegar a ser todo lo complejo que quieras y puedes leer mucho sobre el. La idea que tiene la mayoria de los programadores de c# es basica, ya que realmente no se hace uso de el y el entorno lo utiliza implicitamente, de echo hasta microsoft recomienda que sea el framework el que realice todas las tareas de recoleccion, ya que esta optimizado para ello.

    Pues bien, el recolector no es solo 1, si no que son 2 (bueno, son 2 listas de objetos pendientes para liberar su memoria).

    Ademas, lo mas importante y es por lo que escribo en este post, es para comentar que mucha gente tiene una idea equivocada sobre la recoleccion de objetos y es que el Framework.net no libera los objetos inmediatamente, de echo hay casos en los que nunca los libera y esto es asi por que la creacion y liberacion de memoria dinamica en un sistema es un recurso relativamente costoso y para que vas a hacerlo si no lo necesitas realmente. De modo que solo se van a liberar los objetos cuando la aplicacion necesite esa memoria, mientras no la necesite, no se va a liberar la memoria (a menos que lo fuerces, que es algo no recomendable).

    Ademas, esta tambien lo que ha comentado el amigo Josue (mientras exista una referencia no se va a liberar memoria, de forma similar al patron small pointers de c/c++).

    y para finalizar te dejo un articulo bastante completo en el que te puedes informar algo mas sobre la recoleccion.

    http://www.elguille.info/NET/cursoCSharpErik/Entrega7/Entrega7.htm

     


    Saludos
    David González
    MCP.
    Visita mi Blog en: http://www.dgzornoza.com/
    miércoles, 21 de julio de 2010 7:04
  • Hola Juanfra 3

    Este es un tema que hay que comprender correctamente.

    Cuando tu haces window.Close, la ventana pasa a esperar que el Garbage Collector la recoja y elimine de memoria, siempre y cuando ya no exista ninguna actividad en la ventana ni ninguna referencia a la misma.

    Te pongo un ejemplo:

    Tu tienes un timer activo en tu ventana window1, si haces un window.Close, verás como la memoria no baja nunca, sin embargo, si haces un timer.Stop antes del window.Close, verás como si se elimina correctamente la memoria que usa.

    Lo que quiero explicarte, es que si estás haciendo un Close y no vés que libere la memoria esto se puede deber a algún evento de la ventana o alguna referencia a esa ventana desde otra parte del código que está manteniendola viva, tendrías que revisar esto e intentar encontrar que puede estar evitando que la ventana se destruya de forma correcta.

    Espero haberte servido de ayuda, un gran saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog
    Sigueme en Twitter
    martes, 20 de julio de 2010 8:56
    Moderador

Todas las respuestas

  • Hola Juanfra 3

    Este es un tema que hay que comprender correctamente.

    Cuando tu haces window.Close, la ventana pasa a esperar que el Garbage Collector la recoja y elimine de memoria, siempre y cuando ya no exista ninguna actividad en la ventana ni ninguna referencia a la misma.

    Te pongo un ejemplo:

    Tu tienes un timer activo en tu ventana window1, si haces un window.Close, verás como la memoria no baja nunca, sin embargo, si haces un timer.Stop antes del window.Close, verás como si se elimina correctamente la memoria que usa.

    Lo que quiero explicarte, es que si estás haciendo un Close y no vés que libere la memoria esto se puede deber a algún evento de la ventana o alguna referencia a esa ventana desde otra parte del código que está manteniendola viva, tendrías que revisar esto e intentar encontrar que puede estar evitando que la ventana se destruya de forma correcta.

    Espero haberte servido de ayuda, un gran saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog
    Sigueme en Twitter
    martes, 20 de julio de 2010 8:56
    Moderador
  • Hola Juanfra.

    El Garbage collector es un tema que puede llegar a ser todo lo complejo que quieras y puedes leer mucho sobre el. La idea que tiene la mayoria de los programadores de c# es basica, ya que realmente no se hace uso de el y el entorno lo utiliza implicitamente, de echo hasta microsoft recomienda que sea el framework el que realice todas las tareas de recoleccion, ya que esta optimizado para ello.

    Pues bien, el recolector no es solo 1, si no que son 2 (bueno, son 2 listas de objetos pendientes para liberar su memoria).

    Ademas, lo mas importante y es por lo que escribo en este post, es para comentar que mucha gente tiene una idea equivocada sobre la recoleccion de objetos y es que el Framework.net no libera los objetos inmediatamente, de echo hay casos en los que nunca los libera y esto es asi por que la creacion y liberacion de memoria dinamica en un sistema es un recurso relativamente costoso y para que vas a hacerlo si no lo necesitas realmente. De modo que solo se van a liberar los objetos cuando la aplicacion necesite esa memoria, mientras no la necesite, no se va a liberar la memoria (a menos que lo fuerces, que es algo no recomendable).

    Ademas, esta tambien lo que ha comentado el amigo Josue (mientras exista una referencia no se va a liberar memoria, de forma similar al patron small pointers de c/c++).

    y para finalizar te dejo un articulo bastante completo en el que te puedes informar algo mas sobre la recoleccion.

    http://www.elguille.info/NET/cursoCSharpErik/Entrega7/Entrega7.htm

     


    Saludos
    David González
    MCP.
    Visita mi Blog en: http://www.dgzornoza.com/
    miércoles, 21 de julio de 2010 7:04