| |||
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. |
| |||
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. |
| |||
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. |
| |||
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..... |
| ||||
Cita: Les recomiendo la lectura del siguiente capítulo del libro "Improving .NET Application Performance and Scalability" (que lo pueden bajar en formato pdf): Avoid Calling GC.Collect The default GC.Collect method causes a full collection of all generations. Full collections are expensive because literally every live object in the system must be visited to ensure complete collection. Needless to say, exhaustively visiting all live objects could, and usually does, take a significant amount of time. The garbage collector's algorithm is tuned so that it does full collections only when it is likely to be worth the expense of doing so. As a result, do not call GC.Collect directly — let the garbage collector determine when it needs to run. The garbage collector is designed to be self-tuning and it adjusts its operation to meet the needs of your application based on memory pressure. Programmatically forcing collection can hinder tuning and operation of the garbage collector. http://msdn.microsoft.com/library/de...netchapt06.asp 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) |