¿Por qué las plataformas móviles no admiten la recolección de basura generacional?

11

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.
Rei Miyasaka
fuente
Windows phone (la generación actual) tiene recolección de basura. Solo se ejecuta cuando el dispositivo tiene poca memoria msdn.microsoft.com/en-us/library/gg490770.aspx
Tom Squires
@TomSquires El GC en WP7 se ejecuta una vez cada 1 MB de asignaciones, en realidad. Creo que podría estar pensando en el administrador de tareas que interfiere con los procesos antiguos.
Rei Miyasaka

Respuestas:

5

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.

dasblinkenlight
fuente
3
El GC generacional es mucho más eficiente en la mayoría de los casos, de hecho, por lo que pensaría que reduciría la cantidad de ciclos de reloj. Tampoco explica por qué algo como Xbox no tiene GC generacional, porque las Xbox están conectadas.
Rei Miyasaka
Bueno, eso es lo que escuché en Stack Overflow. Sin embargo, no sé mucho sobre XBox-es.
dasblinkenlight
3
Eso todavía no responde la pregunta. Incluso si la recolección de basura usó más poder que la asignación explícita (lo cual es muy discutible, y no voy a entrar en eso), la pregunta no es si / por qué la asignación explícita es mejor que GC en dispositivos móviles, es si / por qué no GC generacional es mejor que GC generacional en dispositivos móviles.
Rei Miyasaka
1
@Rei: los juegos generalmente requieren que todo sea determinista; al menos, necesitan un rendimiento predecible. Unos pocos nanosegundos desperdiciados aquí y unos pocos nanosegundos desperdiciados allí, en momentos impredecibles, pueden arruinar una experiencia de juego. Los recolectores de basura generacionales son impredecibles.
Ant
2
@djacobson No creo que sea verdad. Como dije en la pregunta, si se tratara solo de las plataformas de Microsoft que descuidan el GC generacional, entonces probablemente sería una razón logística / burocrática, y no me molestaría en preguntar. Pero Android también sufre el mismo problema, por lo que es probable que sea una razón técnica, lo que significa que alguien en P.SE podría tener una respuesta definitiva.
Rei Miyasaka
3

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 .

aij
fuente
2

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.

Winston Ewert
fuente
Aprovechar al máximo las generaciones de GC requiere el uso de cercas de escritura para detectar cuándo se escriben los objetos de generaciones anteriores. Por otro lado, incluso si la porción de "marca" del GC no pudiera beneficiarse de las generaciones, creo que uno podría mejorar el rendimiento solo moviendo las cosas en las generaciones más nuevas (en realidad, haciendo la fase de "etiqueta" en las generaciones anteriores como así como los más nuevos podrían ser útiles si permitieran saber cuánta memoria recuperable existía en cada generación).
supercat