c# - example - GC.Collect()
garbage collector vb (7)
Casi siempre es una optimización prematura preocuparse por llamar a GC.Collect antes de que haya creado un prototipo o haya creado la aplicación y probado su rendimiento. El GC es generalmente muy bueno para recolectar memoria en los momentos apropiados. Sin duda, ejecutará una colección mientras su aplicación esté inactiva, especialmente si hay presión de memoria en el sistema.
Es mucho más importante que siga buenas prácticas de asignación de GC generacionales (objetos pequeños, uso breve, etc.) y probablemente obtenga las características de rendimiento que desea. Si aún no tiene el rendimiento que necesita, después de la creación de perfiles y un buen diseño, podría pensar en GC.Collect como una solución.
Ok, he leído un par de temas al respecto, pero aquí va. Imaginemos que tengo una aplicación donde, básicamente, de vez en cuando, haré clic en un botón, sucederán muchas cosas durante un par de minutos y luego permanecerá inactiva durante una hora o tal vez solo 1 minuto. ¿No acabaría después de todo eso una buena situación para llamar a GC.Collect? Quiero decir, sé que en ese momento no usaré mi aplicación y GC no puede adivinarlo.
Espero que sepas que llamar a GC.Collect no hace que se recojan más (o menos) objetos.
Si está intentando optimizar el tiempo, ¿sabe cuánto tiempo tarda GC en recolectar objetos en su aplicación? En los sistemas operativos de escritorio (XP, Vista, etc.), el CLR utiliza un GC concurrente, y puede ejecutarse sin suspender todos los subprocesos en la aplicación durante la duración de la colección.
Llamar explícitamente a GC.Collect no es recomendable porque
Lanza el algoritmo de sintonización CLR GC fuera de marcha. El sintonizador determina cuándo activar un GC automáticamente y forzar un GC manual con sus cálculos.
Al forzar una colección manualmente, puede terminar promoviendo objetos en una generación: objetos que podrían haberse recolectado en el siguiente GC (si se quedaron "huérfanos" antes de que GC decidiera comenzar).
Puede resultarle interesante que .NET 4.0, un mecanismo de notificación de GC se haya introducido para este tipo de escenarios.
Normalmente, solo se llama al GC si intenta asignar una nueva memoria. Si no te quedas sin memoria, obtendrás un 0% de mejora en el rendimiento al llamar al GC. Tienes que tener una aplicación que requiera muchos recursos para estar cerca de los límites de RAM en las computadoras de hoy.
Si el programa tiene muchos recursos externos (como archivos o referencias COM / DCOM), es posible que desee llamar al GC.
Si llamar al GC te dará tranquilidad, entonces adelante. Probablemente no ayude, pero ciertamente no duele.
Para saber cuándo llamar a GC.Collect()
, debe conocer los detalles del recopilador específico involucrado con el tiempo de ejecución junto con información detallada sobre un punto débil que puede resolver con la colección.
En otras palabras, si realmente sabe cuándo debe llamar a GC.Collect()
, y no es algo que haya hecho mal en otro código, entonces probablemente trabaje para CLR Internals y solo pueda solucionar el problema.
Puedo ver que varias personas se han puesto extremos por no recomendar llamar a GC.Collect.
GC.Collect está ahí por una razón, aquí está mi recomendación de cuándo y por qué llamar a GC.Collect.
En General, no se preocupe por llamarlo, GC se sintoniza muy bien y hará lo correcto.
A veces, terminas en una situación en la que sabes con seguridad que este es el momento adecuado para llamarlo, la situación que describiste anteriormente es exactamente el momento adecuado para llamarlo, de hecho, Asp.Net llama a GC.Collect en ciertos puntos que son similar a lo que describiste.
El GC es inteligente en cuanto a llamar a GC.Collect, si llamó a GC.Collect, el GC puede anular su decisión y aún así no cobra (debe establecer una marca cuando llame a GC.Collect para elegir este comportamiento), esto es La forma recomendada de llamar a GC.Collect, ya que todavía está dejando que el GC decida si es un buen momento para recolectar.
No acepte que mi recomendación es una declaración general para llamar a GC.Collect, siempre debe evitar llamarla, a menos que esté REALMENTE seguro de que necesita llamarlo, una situación como la que describió es exactamente la razón por la cual GC.Collect está allí.
El beneficio que obtendrá al llamarlo es liberar la basura rápidamente, por lo general le preocupará esta situación si
- Está en una situación de poca memoria y desea estar ansioso por la recolección. Si está en una situación de poca memoria, el GC será agresivo de todos modos y se activará automáticamente si la presión de la memoria es alta en la máquina.
- Si quieres evitar estar en una situación de poca memoria y quieres coleccionar con entusiasmo.
Espero que esto ayude.
Gracias
Sí, como se mencionó en otras publicaciones, GC sabe cuándo comenzar la recolección mejor que usted, el hecho de que no se haga clic en ningún botón en su aplicación no significa que sea el momento de comenzar a limpiar, GC está haciendo algún tipo de bloqueo al mover los objetos , por lo que esto puede causar un bajo rendimiento si abusa de GC.Collect
Casi nunca hay una buena razón para llamar a GC.Collect()
.
En tu caso, no hay absolutamente ninguna razón para llamarlo. Si está inactivo durante una hora, el GC hará sus colecciones.