¿Qué puede y no puede hacer el recolector de basura?

8

¿Se ocupará el GC de todos los problemas de administración de memoria (pérdidas de memoria)?

¿Hay algún caso en el que no desee que el GC tome el control de alguna parte de su código?

invariante
fuente
No puede recuperarse, aunque debería.
derecha el

Respuestas:

10

Se ocupará de los problemas clásicos de administración de memoria (la memoria asignada no se desacopla cuando ya no está en uso), aunque todavía es posible tener pérdidas de memoria con un sistema GC; esto será más sutil y ocurrirá cuando los objetos aún tengan referencias a otros objetos, incluso cuando ya no lo necesitan.

Vea la pregunta ¿Por qué .NET no puede tener pérdidas de memoria? y sus respuestas en StackOverflow.

Puede haber x. situaciones en las que desea un control total sobre la asignación de memoria, pero, francamente, los beneficios de un sistema GC son tales que normalmente no será necesario.

Oded
fuente
1
Las únicas situaciones en las que puedo pensar que las penalizaciones son demasiado altas son en sistemas que mueven cantidades masivas de datos muy rápidamente a través de memoria limitada como gráficos de alta gama o sistemas con memoria muy limitada en primer lugar, como un controlador integrado.
Ingeniero mundial
@WorldEngineer: es cierto, por eso .NET ha fijado objetos, lo que le permite un mayor control sobre las secciones de la memoria.
Oded
Computación de alto rendimiento, sistemas de comercio de baja latencia, etc. a todos les encantaría controlar su GC :-)
Martijn Verburg
Oh, podrían sintonizarlo bien. Incluso hay toda una clase de GC de alta gama dedicados a hacer pausas pequeñas y limitar la cantidad de tiempo que pasa en GC (GC incrementales y concurrentes), con candidatos listos para la producción. Pero aparentemente incluso eso no es suficiente para algunos de ellos (no puedo decir si eso es razonable). Entonces lo dejan, junto con la compilación JIT.
@SamSaffron publicó este enlace en Twitter en un artículo donde el comportamiento explícito de GC se utilizó (ab) para obtener una ventaja marcgravell.blogspot.com/2011/10/assault-by-gc.html
Carlo Kuip el
2

Hay muchos problemas de memoria (punteros colgantes, desbordamientos de búfer y similares) y problemas de recursos (pérdidas de memoria, otras pérdidas de recursos). El recolector de basura se encarga de:

  • punteros colgantes
  • principalmente pérdidas de memoria
  • parcialmente otras fugas de recursos

El lenguaje que no permite la aritmética del puntero se encarga de:

  • desbordamiento del búfer y otros casos de punteros inválidos

Tampoco puede resolver otros casos de problemas de recursos en los que olvida eliminar la referencia a la memoria / recurso de alguna parte, por lo que aún puede tener pérdida de memoria con GC (los objetos de excepción son especialmente notables para hacer referencia a muchas cosas que no conoce).

Si bien GC puede ayudarlo a liberar otros recursos además de la memoria mediante el uso de finalizadores (destructores), liberará esos recursos con un retraso no determinista, que a menudo no es apropiado para recursos como archivos o tomas de red. Para manejar este tipo de problemas de recursos, necesita una construcción de lenguaje para recursos con alcance, como el uso de la instrucción en C #, el lenguaje RAII en C ++ o la última extensión para probar la sintaxis en Java 7 y todavía es solo una ayuda, porque necesita usarlo en el código .

No es necesario permitir la aritmética del puntero y crear direcciones a partir de números para poder ejecutar un recolector de basura preciso. Algunas optimizaciones útiles, como la compactación, solo se pueden implementar en recopiladores precisos (solo puede mover objetos si puede saber con certeza cuál es una referencia, por lo que puede actualizarla; no puede hacerlo en C / C ++).

Jan Hudec
fuente
1

La recolección de basura funciona bien para la memoria. Si tiene un montón de memoria, ¿por qué correr limpiando cada byte mientras se hace? El GC generalmente responde a la "presión de memoria" y se limpia cuando es necesario. Esto es bueno para la memoria. Sin embargo, si tiene un objeto que contiene un recurso que no es de memoria (identificador de archivo, conexión de base de datos, bloqueo) esperando hasta que la presión de la memoria desencadene, GC generalmente significa retener ese recurso demasiado tiempo. Necesita otro enfoque para esos recursos. Eso podría significar un recurso compartido de recuento de referencias, con una versión determinista cuando el recuento de referencias llega a cero, o el enfoque de uso / desecho de .NET.

Kate Gregory
fuente
0

GC systems es un software que intenta optimizar el uso de memoria para un programa en ejecución.

El sistema GS es responsabilidad y es un componente del marco (JVM / .NET).

Puede liberar memoria para algunos objetos que predice que no serán necesarios para una aplicación después de un punto dado en el procesamiento.

En .NET solo puede liberar memoria para algunos objetos nativos .NET y no para objetos MS COM.

Los objetos MS COM utilizados en .NET deben liberarse explícitamente.

Referencias

MSDN: recolección de basura

Wikipedia: Colección Gabage

Ninguna posibilidad
fuente
¿Por qué degradado-sus comentarios son apreciados?
NoChance