Mejores prácticas para forzar la recolección de basura en C#

Resuelto Echostorm asked hace 16 años • 17 respuestas

En mi experiencia, parece que la mayoría de la gente le dirá que no es prudente forzar una recolección de basura, pero en algunos casos cuando trabaja con objetos grandes que no siempre se recolectan en la generación 0 pero donde la memoria es un problema, es ¿Está bien forzar el cobro? ¿Existe alguna práctica recomendada para hacerlo?

Echostorm avatar Oct 24 '08 20:10 Echostorm
Aceptado

La mejor práctica es no forzar la recolección de basura.

Según MSDN:

"Es posible forzar la recolección de basura llamando a Collect, pero la mayoría de las veces esto debe evitarse porque puede crear problemas de rendimiento".

Sin embargo, si puede probar su código de manera confiable para confirmar que llamar a Collect() no tendrá un impacto negativo, entonces continúe...

Sólo trata de asegurarte de que los objetos estén limpios cuando ya no los necesites. Si tiene objetos personalizados, considere usar la "declaración de uso" y la interfaz IDisposable.

Este enlace tiene algunos buenos consejos prácticos con respecto a la liberación de memoria/recolección de basura, etc.:

http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

Mark Ingram avatar Oct 24 '2008 14:10 Mark Ingram

Míralo de esta manera: ¿es más eficiente tirar la basura de la cocina cuando el bote de basura está al 10% o dejar que se llene antes de sacarla?

Al no dejar que se llene, estás perdiendo el tiempo caminando hacia y desde el contenedor de basura afuera. Esto es análogo a lo que sucede cuando se ejecuta el subproceso GC: todos los subprocesos administrados se suspenden mientras se ejecuta. Y si no me equivoco, el hilo de GC se puede compartir entre varios AppDomains, por lo que la recolección de basura los afecta a todos.

Por supuesto, es posible que te encuentres con una situación en la que no agregues nada al bote de basura en el corto plazo (por ejemplo, si te vas a tomar unas vacaciones). Entonces, sería buena idea tirar la basura antes de salir.

Este PODRÍA ser un momento en el que forzar un GC puede ayudar: si su programa está inactivo, la memoria en uso no se recolecta como basura porque no hay asignaciones.

Maxam avatar Nov 02 '2008 02:11 Maxam

La mejor práctica es no forzar la recolección de basura en la mayoría de los casos. (Todos los sistemas en los que he trabajado que tenían recolecciones de basura forzadas tenían problemas subrayados que, si se resolvieran, habrían eliminado la necesidad de forzar la recolección de basura y aceleraron enormemente el sistema).

Hay algunos casos en los que usted sabe más sobre el uso de la memoria que el recolector de basura. Es poco probable que esto sea cierto en una aplicación multiusuario o en un servicio que responde a más de una solicitud a la vez.

Sin embargo, en algunos tipos de procesamiento por lotes, usted sabe más que el GC. Por ejemplo, considere una aplicación que.

  • Se proporciona una lista de nombres de archivos en la línea de comando.
  • Procesa un solo archivo y luego escribe el resultado en un archivo de resultados.
  • Mientras se procesa el archivo, se crean una gran cantidad de objetos interconectados que no se pueden recopilar hasta que se haya completado el procesamiento del archivo (por ejemplo, un árbol de análisis).
  • No mantiene mucho estado entre los archivos que ha procesado .

Es posible que pueda argumentar (después de realizar pruebas cuidadosas) que debe forzar una recolección de basura completa después de haber procesado cada archivo.

Otro caso es un servicio que se activa cada pocos minutos para procesar algunos elementos y no mantiene ningún estado mientras está dormido . Entonces puede valer la pena forzar una recolección completa justo antes de irse a dormir.

El único momento en el que consideraría forzar una colección es cuando sé que se han creado muchos objetos recientemente y que actualmente se hace referencia a muy pocos objetos.

Preferiría tener una API de recolección de basura cuando pudiera darle sugerencias sobre este tipo de cosas sin tener que forzar un GC por mi cuenta.

Véase también " Cositas de actuación de Rico Mariani "

Ian Ringrose avatar Sep 24 '2009 15:09 Ian Ringrose

Creo que el ejemplo dado por Rico Mariani fue bueno: puede ser apropiado activar un GC si hay un cambio significativo en el estado de la aplicación. Por ejemplo, en un editor de documentos puede estar bien activar un GC cuando se cierra un documento.

denis phillips avatar Nov 02 '2008 02:11 denis phillips