![]() |
Aprovechamiento de memoria Hola, he observado en mi aplicación que al ejecutarla, si abro y cierro formularios la memoria no vuelve al punto de partida, se pierden algunos kb. Pueden darme algunas consideraciones de que objetos, cerrar y liberar para q el desaprovexamiento sea el mínimo?, gracias. |
Eso es porque los recursos no quedan del todo liberados, busca información sobre el Garbage Collector de .NET. |
Muy bien, gracias. |
Hola, he leído sobre el recolector de basura pero no m kedan las cosas muy claras. Se supone q l GC solo libera la memoria reservada con new y este actúa cuándo lo considera oportuno, no sabemos el momento justo en el q va a liberar los recursos. Se supone q si keremos obligar a q se liberen n un momento dado tenemos q usar el método dispose (para los recursos IDisposable) o close. Yo ya cierro las conexiones. Tendría q cerrar o liberar algo más a mano o lo dejo en manos dl GC?. Pq estoy pensando q si yo hago por ejemplo alegremente form1.dispose puede q si después hago form1.show este ya no se muestre. Si alguien tiene estas cosas más claras y m puede decir algo... saludos. |
Si haces form1.Dispose como dices ya no puedes hacer form1.show, puesto que ya no existe dicho form1 deberías volver a hacer un new antes de volver a llamarlo. Todo lo demás lo has entendido bien, pero aunque llames al Dispose no quedará del todo liberado el recurso hasta que haga su aparicion el GC, aunque no debería ser así, es decir, tiene sus ventajas y sus incovenientes. Por otro lado decirte que se puede obligar al GC a entrar en accion (ahora mismo no recuerdo la instruccion), pero tampoco se asegura que queden liberados. Esto pasa con todas las aplicaciones no te quiebres mucho (aunque no sean .NET), no tienes más que ver que si tienes una máquina encendida durante mucho tiempo (hablo de semanas) sin apagar, por mucho que mates procesos y termines aplicaciones el rendimiento no es el mismo que recién iniciado. |
Ya m suena a mí tb un método q hay para llamar manualmente al GC pero tampoco recuerdo como era. D todas formas m pareció leer q no era muy aconsejable hacerlo y ante la duda por lo menos en mi caso casi mejor no invocarlo. Entonces m puedo limitar a cerrar las conexiones y poco más? pq si ya lo va a hacer el GC no? supuestamente este ya libera las cosas cuándo lo ve oportuno cuándo ya no hay referencias a objetos ni nada. |
Hasta donde yo se, asi es. (pero hazles un Dispose para que el GC los libere ya que si considera que deben permanecer en memoria no los liberará) |
Muy bien, gracias nuevamente :arriba: |
Disculpen que me meta en donde no debo, pero no basta con destruir el objeto? Saludos... |
No, no basta con destruir el objeto, es necesario indicar de vez en cuando en el programa que hagas una instruccion tal que GC.Collect() entonces se libera la memoria 'no utilizada' (la que has liberado con metodos dispose) Según lo que he probado, aunque ejecutes el metodo Dispose de todos los objetos el Garbage colletor no liberar nada de memoria (esperas de 30 minutos me parecen mas que suficientes) y espera a que cierres la aplicación para liberar la memoria utilizada. Por lo que he comentado con otros colegas, el problema de usar esa instrucción es de rendimiento (mientras la ejecuta), pero la verdad es que cuando la he utilizado no me ha dado ningun problema. Saludos..... |
Hola, esa era la instrucción dl GC a la q m refería. Entonces habrá q probar d vez en cuándo a ponerla a ver q sucede, gracias :adios: |
Cita:
http://msdn.microsoft.com/library/de...netchapt06.asp Saludos |
Gracias Xknown, yo lo leeré cuándo tenga un rato pero a bote pronto parece q no aconseja llamar directamente a GC.Collect, saludos |
Solo una duda que me queda a mi (y perdonen si esta resuelta en el link, pero es que todavía no lo he leido). Si en una aplicacion web (aunque no estemos en el subforo adecuado), se llama a GC, desde el load de una página, y supongamos que un usuario entra en esa página, ¿se liberarían todos los objetos "muertos" de la aplicación o sólo de la session??????????? (Voy a intentar leerlo pronto para autoresponderme) |
| La zona horaria es GMT -6. Ahora son las 07:10. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.