No hay una sola cosa llamada recolección de basura, hay varios algoritmos y estrategias, y la respuesta depende tanto de la implementación real como de los patrones de uso de memoria de cada aplicación. Es por eso que algunos sistemas realmente admiten múltiples algoritmos y permiten que el desarrollador decida cuál usar. Y casi todos los sistemas, incluso aquellos que utilizan un solo algoritmo, admiten algún tipo de API de configuración / administración de GC para casos especiales.
Una razón por la cual GC usa más memoria que otras técnicas de administración de memoria es que la memoria no se recupera inmediatamente cuando no se utiliza. La estrategia para decidir cuándo comenzar un pase de GC varía según el sistema y puede ser diferente para los objetos asignados recientemente y para los objetos que han estado en uso durante algún tiempo. En todos los casos, pasa un tiempo desde que un objeto queda “sin usar” y desde el momento en que se recupera su memoria, lo que implica que, en un sistema GC, al menos parte de la memoria que actualmente está “asignada” no se utiliza: es la basura que finalmente se liberará la próxima vez que se active el GC.
Otra razón es que los llamados “colectores de copia” copiarán efectivamente todos los objetos que actualmente están “vivos” en un área recientemente asignada cada vez que se ejecute el GC. Esto significa que la aplicación usa al menos 2 veces más memoria de la que necesitaría: cada vez que el GC comienza a ejecutarse, debe haber guardado una cantidad de memoria libre que es tan grande como la memoria actualmente en uso, incluida la memoria activa y la basura objetos (porque todavía no sabe lo que está vivo y lo que es basura).
- ¿No se usa incorrectamente el acrónimo RAM y el término memoria volátil?
- ¿Es una MacBook Pro 13 "con 8GB de RAM y 128GB SSD lo suficientemente buena como para editar con Logic Pro X?
- ¿Puedo ejecutar FIFA 15 y FIFA 16 en un sistema con la configuración de Intel Core I5, 4GB RAM, Nvidia y GeForce 820M 2GB?
- ¿Puedo i5 5th gen con 8 GB de ram, nvidia geforce 920 m ejecutar la última versión de trabajos sólidos y probar creo?
- ¿Un móvil Android de 4 GB de RAM consumirá más batería que un móvil de 3 GB de RAM?
Uno puede pensar que tal estrategia es absurda: ¿por qué usar el doble de memoria? La respuesta es que para algunas aplicaciones esta estrategia es extremadamente efectiva. La asignación de memoria es extremadamente rápida (mucho más rápida que con cualquier otro mecanismo) y la recolección de basura también puede ejecutarse relativamente rápido si la tasa de supervivencia de los objetos es baja. De hecho, para una aplicación en la que se asigna una cantidad extremadamente grande de objetos pero su supervivencia es muy baja (casi todos se asignan, se usan inmediatamente y luego se abandonan) un recolector de basura de copiado es posiblemente la solución más rápida: podría ser mucho más rápido que la gestión manual de memoria.
En la mayoría de los casos (no todos, siempre hay ejemplos contrarios para cada estrategia: no existe una estrategia que sea siempre mejor que cualquier otra) una estrategia de gestión de memoria basada en GC proporciona un mejor rendimiento general que otros sistemas, incluida la gestión manual. Los inconvenientes son que usa más memoria (las estadísticas dicen que aproximadamente 1.6 a 1.8 veces más para la aplicación promedio en una implementación moderna de GC) y que la ejecución de la aplicación no es “uniforme” de una manera no predecible, lo que puede ser un gran problema a tiempo sistemas críticos y en aplicaciones como juegos que necesitan garantizar una velocidad de fotogramas uniforme.