Tanto Windows Phone / Xbox como Android carecen de soporte para la recolección de basura generacional. Esto es frustrante para muchos programadores. Parece que hay una razón de ingeniería legítima, pero no puedo entenderlo.
Los teléfonos actuales tienen más memoria y probablemente mejores CPU que las computadoras de escritorio / portátiles que ejecutan .NET 1.1 con GC generacional en 2001, y no puedo pensar en ninguna razón por la cual los procesadores ARM serían peores en GC generacional que x86. También hay menos necesidad de realizar múltiples tareas en teléfonos y consolas, por lo que hay relativamente más espacio libre en el montón.
Entonces, ¿qué da?
Editar: algunos puntos para aclarar:
- Estas plataformas utilizan la recolección de basura para aplicaciones exclusivamente, por lo que mi pregunta no es por qué GC no es compatible; Mi pregunta es por qué la recolección de basura generacional no lo es.
- La razón por la cual las personas se sienten frustradas por la falta de GC generacional es que el GC no generacional es extremadamente ineficiente. (Eso significa que la duración de la batería no es la razón).
- Creo que hay una razón técnica honesta para la falta de soporte generacional de GC. Esta no es una pregunta retórica.
java
.net
android
windows-phone-7
garbage-collection
Rei Miyasaka
fuente
fuente
Respuestas:
Creo que el mayor problema es la duración de la batería. La recolección de basura es una conveniencia del desarrollador comprada al precio de ciclos de CPU adicionales en la computadora del usuario . Cuando su CPU está enchufada (computadora de escritorio) o tiene una batería relativamente grande (computadora portátil), sus usuarios están más dispuestos a pagar por la comodidad de los desarrolladores con la energía adicional que consume la CPU mientras recolectan basura. Cuando la batería es relativamente pequeña, los usuarios pueden no ser tan generosos. Es posible que quieran ese bar adicional para ellos, tal vez para hablar con sus amigos o para matar algunos cerdos adicionales en un encuentro mortal con pájaros enojados.
No importa cuáles sean las razones de los usuarios, los desarrolladores de sistemas operativos no quieren formarse una percepción de que los dispositivos que ejecutan su sistema operativo agotan la batería más rápido que los que ejecutan el sistema operativo de su competencia. Por lo tanto, compran una mejor percepción del tiempo de vida útil esperado de la batería de sus dispositivos al precio de la conveniencia de los desarrolladores: para ellos, su dolor no es gran cosa, siempre y cuando los usuarios estén contentos con los dispositivos.
fuente
Mi mejor suposición sería que no es una razón técnica, sino que los desarrolladores de esas plataformas telefónicas simplemente no se han esforzado todavía. Sé que no es la respuesta que esperas, pero si has realizado algún desarrollo móvil, probablemente hayas notado que hay muchos frutos bajos. Probablemente simplemente no hayan tenido tiempo de escribir múltiples implementaciones de GC, afinarlas todas y seleccionar la que mejor funcione. ¿Por qué alguien pasaría tiempo reinventando la rueda cuando en su lugar podrían lanzar API nuevas, llamativas y mal pensadas? ;)
FWIW, y como confirmación de mi teoría, el nuevo tiempo de ejecución de Android (ART) tiene un GC generacional y planean tener un GC de compactación en el futuro .
fuente
Hay un costo adicional para la recolección de basura generacional.
El recopilador generacional debe poder descubrir cuándo los objetos más antiguos apuntan a los más nuevos. No podemos rastrear el objeto anterior para encontrar estos casos porque eso anularía el propósito de la colección generacional. En cambio, de alguna manera necesitamos detectar cuándo sucede esto y tomar nota de ello para la fase de recopilación. Independientemente de cómo vaya a hacer eso, agregará algunos gastos generales al proceso de recopilación.
En un sistema de escritorio, su sistema operativo está ocupado haciendo todo tipo de cosas con memoria detrás de escena. Admite características como compartir páginas entre procesos, escribir páginas no utilizadas en el disco, proporcionar mapeo de memoria entre procesos, etc. Entiendo que parte de la funcionalidad utilizada allí permite rastrear de manera más eficiente los punteros que se están cambiando. La operación ya está preocupada por lo que está cambiando en la memoria, por lo que usar esa información para nuevos propósitos no es un problema.
Sospecho que los sistemas móviles no están haciendo las mismas cosas detrás de escena. Como resultado, no tienen el mismo nivel de información que tendría un escritorio. En consecuencia, la sobrecarga involucrada en la implementación de una colección general es mayor y es menos probable que valga la pena.
fuente