Retroceder   Foros del Web > Programación para sitios web > .NET > win forms

Respuesta
 
Herramientas Desplegado
Antiguo 16-nov-2005, 02:52   #1 (permalink)
Mary_ ha deshabilitado el karma
 
Fecha de Ingreso: abril-2005
Mensajes: 163
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.
Mary_ está desconectado   Responder Citando
Antiguo 16-nov-2005, 03:42   #2 (permalink)
Jose_minglein2 tiene algunos puntos positivos de karma
 
Avatar de Jose_minglein2
 
Fecha de Ingreso: noviembre-2004
Mensajes: 2.338
Eso es porque los recursos no quedan del todo liberados, busca información sobre el Garbage Collector de .NET.
Jose_minglein2 está desconectado   Responder Citando
Antiguo 16-nov-2005, 04:15   #3 (permalink)
Mary_ ha deshabilitado el karma
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Muy bien, gracias.
Mary_ está desconectado   Responder Citando
Antiguo 17-nov-2005, 02:23   #4 (permalink)
Mary_ ha deshabilitado el karma
 
Fecha de Ingreso: abril-2005
Mensajes: 163
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.
Mary_ está desconectado   Responder Citando
Antiguo 17-nov-2005, 02:32   #5 (permalink)
Jose_minglein2 tiene algunos puntos positivos de karma
 
Avatar de Jose_minglein2
 
Fecha de Ingreso: noviembre-2004
Mensajes: 2.338
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.
Jose_minglein2 está desconectado   Responder Citando
Antiguo 17-nov-2005, 08:04   #6 (permalink)
Mary_ ha deshabilitado el karma
 
Fecha de Ingreso: abril-2005
Mensajes: 163
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.
Mary_ está desconectado   Responder Citando
Antiguo 17-nov-2005, 08:24   #7 (permalink)
Jose_minglein2 tiene algunos puntos positivos de karma
 
Avatar de Jose_minglein2
 
Fecha de Ingreso: noviembre-2004
Mensajes: 2.338
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á)
Jose_minglein2 está desconectado   Responder Citando
Antiguo 17-nov-2005, 10:26   #8 (permalink)
Mary_ ha deshabilitado el karma
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Muy bien, gracias nuevamente
Mary_ está desconectado   Responder Citando
Antiguo 17-nov-2005, 10:48   #9 (permalink)
alexeiiw ha deshabilitado el karma
 
Avatar de alexeiiw
 
Fecha de Ingreso: agosto-2005
Ubicación: Guatemala
Mensajes: 72
Enviar un mensaje por MSN a alexeiiw
Disculpen que me meta en donde no debo, pero no basta con destruir el objeto?

Saludos...
alexeiiw está desconectado   Responder Citando
Antiguo 17-nov-2005, 12:56   #10 (permalink)
pumisu ha deshabilitado el karma
 
Fecha de Ingreso: octubre-2005
Mensajes: 16
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.....
pumisu está desconectado   Responder Citando
Antiguo 17-nov-2005, 13:05   #11 (permalink)
Mary_ ha deshabilitado el karma
 
Fecha de Ingreso: abril-2005
Mensajes: 163
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
Mary_ está desconectado   Responder Citando
Antiguo 17-nov-2005, 13:31   #12 (permalink)
xknown está en el buen camino
 
Avatar de xknown
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.249
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
xknown está desconectado   Responder Citando
Antiguo 17-nov-2005, 13:43   #13 (permalink)
Mary_ ha deshabilitado el karma
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Gracias Xknown, yo lo leeré cuándo tenga un rato pero a bote pronto parece q no aconseja llamar directamente a GC.Collect, saludos
Mary_ está desconectado   Responder Citando
Antiguo 19-nov-2005, 06:13   #14 (permalink)
Jose_minglein2 tiene algunos puntos positivos de karma
 
Avatar de Jose_minglein2
 
Fecha de Ingreso: noviembre-2004
Mensajes: 2.338
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)
Jose_minglein2 está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 03:53.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93