Foros del Web » Programación para mayores de 30 ;) » .NET »

Aprovechamiento de memoria

Estas en el tema de Aprovechamiento de memoria en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 16/11/2005, 03:52
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
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.
  #2 (permalink)  
Antiguo 16/11/2005, 04:42
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Eso es porque los recursos no quedan del todo liberados, busca información sobre el Garbage Collector de .NET.
  #3 (permalink)  
Antiguo 16/11/2005, 05:15
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Muy bien, gracias.
  #4 (permalink)  
Antiguo 17/11/2005, 03:23
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
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.
  #5 (permalink)  
Antiguo 17/11/2005, 03:32
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
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.
  #6 (permalink)  
Antiguo 17/11/2005, 09:04
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
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.
  #7 (permalink)  
Antiguo 17/11/2005, 09:24
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
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á)
  #8 (permalink)  
Antiguo 17/11/2005, 11:26
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Muy bien, gracias nuevamente
  #9 (permalink)  
Antiguo 17/11/2005, 11:48
Avatar de alexeiiw  
Fecha de Ingreso: agosto-2005
Ubicación: Guatemala
Mensajes: 73
Antigüedad: 18 años, 8 meses
Puntos: 1
Disculpen que me meta en donde no debo, pero no basta con destruir el objeto?

Saludos...
  #10 (permalink)  
Antiguo 17/11/2005, 13:56
 
Fecha de Ingreso: octubre-2005
Mensajes: 16
Antigüedad: 18 años, 6 meses
Puntos: 0
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.....
  #11 (permalink)  
Antiguo 17/11/2005, 14:05
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
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
  #12 (permalink)  
Antiguo 17/11/2005, 14:31
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
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
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #13 (permalink)  
Antiguo 17/11/2005, 14:43
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Gracias Xknown, yo lo leeré cuándo tenga un rato pero a bote pronto parece q no aconseja llamar directamente a GC.Collect, saludos
  #14 (permalink)  
Antiguo 19/11/2005, 07:13
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
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)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:58.