Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   .NET (http://www.forosdelweb.com/f29/)
-   -   Aprovechamiento de memoria (http://www.forosdelweb.com/f29/aprovechamiento-memoria-350373/)

Mary_ 16/11/2005 03:52

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.

Jose_minglein2 16/11/2005 04:42

Eso es porque los recursos no quedan del todo liberados, busca información sobre el Garbage Collector de .NET.

Mary_ 16/11/2005 05:15

Muy bien, gracias.

Mary_ 17/11/2005 03:23

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.

Jose_minglein2 17/11/2005 03:32

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.

Mary_ 17/11/2005 09:04

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.

Jose_minglein2 17/11/2005 09:24

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á)

Mary_ 17/11/2005 11:26

Muy bien, gracias nuevamente :arriba:

alexeiiw 17/11/2005 11:48

Disculpen que me meta en donde no debo, pero no basta con destruir el objeto?

Saludos...

pumisu 17/11/2005 13:56

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.....

Mary_ 17/11/2005 14:05

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:

xknown 17/11/2005 14:31

Cita:

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.
Les recomiendo la lectura del siguiente capítulo del libro "Improving .NET Application Performance and Scalability" (que lo pueden bajar en formato pdf):
http://msdn.microsoft.com/library/de...netchapt06.asp

Saludos

Mary_ 17/11/2005 14:43

Gracias Xknown, yo lo leeré cuándo tenga un rato pero a bote pronto parece q no aconseja llamar directamente a GC.Collect, saludos

Jose_minglein2 19/11/2005 07:13

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.