¿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?
java
programming-languages
c#
invariante
fuente
fuente
Respuestas:
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.
fuente
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:
El lenguaje que no permite la aritmética del puntero se encarga de:
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 ++).
fuente
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.
fuente
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
fuente