Perché le piattaforme mobili non supportano la garbage collection generazionale?


11

Sia Windows Phone / Xbox che Android non supportano la raccolta dei rifiuti generazionale. Questo è frustrante per molti programmatori. Sembra esserci una ragione ingegneristica legittima, ma non riesco a capirlo.

I telefoni attuali hanno più memoria e probabilmente CPU migliori rispetto ai desktop / laptop che eseguono .NET 1.1 con GC generazionale nel 2001, e non riesco a pensare a nessuna ragione per cui i processori ARM sarebbero peggiori in GC generazionale rispetto a x86. C'è anche meno bisogno di multitasking su telefoni e console, quindi c'è spazio heap relativamente più libero.

Quindi cosa dà?

Modifica: alcuni punti per chiarire:

  • Queste piattaforme usano esclusivamente la garbage collection per le app, quindi la mia domanda non è perché GC non sia supportato; la mia domanda è sul perché la raccolta dei rifiuti generazionale non lo è.
  • La ragione per cui le persone sono frustrate dalla mancanza di GC generazionale è che il GC non genrazionale è estremamente inefficiente. (Ciò significa che la durata della batteria non è la ragione.)
  • Credo che ci sia un motivo tecnico onesto per la mancanza di supporto generazionale GC. Questa non è una domanda retorica.

Windows Phone (l'attuale generazione) ha la garbage collection. Funziona solo quando il dispositivo ha poca memoria msdn.microsoft.com/en-us/library/gg490770.aspx
Tom Squires

@TomSquires Il GC su WP7 viene eseguito una volta ogni 1 MB di allocazioni, in realtà. Penso che potresti pensare al task manager che crede i vecchi processi.
Rei Miyasaka,

Risposte:


5

Penso che il problema più grande sia la durata della batteria. La garbage collection è una comodità per gli sviluppatori acquistata al prezzo di ulteriori cicli della CPU sul computer dell'utente . Quando la tua CPU è collegata (desktop) o ha una batteria relativamente grande (laptop), i tuoi utenti sono più disposti a pagare per la comodità degli sviluppatori con l'energia aggiuntiva consumata dalla CPU durante la raccolta dei rifiuti. Quando la batteria è relativamente piccola, gli utenti potrebbero non essere così generosi. Potrebbero desiderare quella barra aggiuntiva per se stessi - forse per parlare con i loro amici o per uccidere qualche maiale in più in un incontro mortale con uccelli arrabbiati.

Indipendentemente dalle ragioni degli utenti, gli sviluppatori del sistema operativo non vogliono capire che i dispositivi che eseguono il loro sistema operativo consumano la batteria più velocemente di quelli che eseguono il sistema operativo del loro concorrente. Quindi acquistano una migliore percezione della durata prevista della batteria dei loro dispositivi al prezzo della comodità degli sviluppatori: per loro, il tuo dolore non è un grosso problema, a condizione che gli utenti siano soddisfatti dei dispositivi.


3
Il GC generazionale è molto più efficiente nella maggior parte dei casi, quindi penseresti che ridurrebbe il numero di cicli di clock. Inoltre non spiega perché qualcosa come Xbox non ha GC generazionale, perché le Xbox sono collegate.
Rei Miyasaka

Bene, questo è quello che ho sentito su Stack Overflow. Non so molto su XBox-es, però.
dasblinkenlight,

3
Questo non risponde ancora alla domanda. Anche se la garbage collection ha usato più potenza dell'allocazione esplicita (che è altamente discutibile - e non ci entrerò), la domanda non è se / perché l'allocazione esplicita sia migliore di GC sui dispositivi mobili, è se / perché non- il GC generazionale è migliore del GC generazionale su dispositivo mobile.
Rei Miyasaka,

1
@Rei: i giochi in genere richiedono che tutto sia deterministico; almeno, hanno bisogno di prestazioni prevedibili. Alcuni nanosecondi sprecati qui e alcuni nanosecondi sprecati lì - in momenti imprevedibili - possono rovinare un'esperienza di gioco. I netturbini generazionali sono imprevedibili.
Formica

2
@djacobson Non penso sia vero. Come ho detto nella domanda, se fossero solo le piattaforme di Microsoft a trascurare il GC generazionale, probabilmente sarebbe solo una ragione logistica / burocratica e non mi preoccuperei di chiedere. Ma Android soffre anche dello stesso problema, quindi è probabilmente un motivo tecnico, il che significa che qualcuno su P.SE potrebbe avere una risposta definitiva.
Rei Miyasaka,

3

La mia ipotesi migliore sarebbe che non è un motivo tecnico, ma che gli sviluppatori per quelle piattaforme telefoniche semplicemente non si sono ancora impegnati. So che non è la risposta che speri, ma se hai fatto uno sviluppo mobile probabilmente avrai notato che c'è molta frutta in sospensione. Probabilmente semplicemente non hanno avuto il tempo di scrivere più implementazioni GC, perfezionarle tutte e selezionare quella che fa meglio. Perché qualcuno dovrebbe passare il tempo a reinventare la ruota quando potrebbe invece rilasciare API nuove, appariscenti e mal concepite? ;)

FWIW, e come conferma della mia teoria, il nuovo runtime (ART) di Android ha un GC generazionale e stanno pianificando di avere un GC compattante in futuro .


2

C'è un costo aggiuntivo per la raccolta dei rifiuti generazionale.

Il collector generazionale deve essere in grado di scoprire quando oggetti più vecchi puntano a oggetti più nuovi. Non possiamo tracciare l'oggetto più vecchio per trovare questi casi perché ciò vanificherebbe lo scopo della raccolta generazionale. Invece, dobbiamo in qualche modo rilevare quando ciò accade e prenderne nota per la fase di raccolta. Indipendentemente da come lo farai, aggiungerà un certo sovraccarico al processo di raccolta.

Su un sistema desktop, il tuo sistema operativo è impegnato a fare qualsiasi cosa con la memoria dietro le quinte. Supporta funzionalità come la condivisione di pagine tra processi, la scrittura di pagine inutilizzate su disco, la mappatura della memoria tra processi, ecc. La mia comprensione è che alcune delle funzionalità utilizzate lì consentono di tracciare in modo più efficiente i puntatori modificati. L'operazione è già preoccupante per ciò che si sta modificando in memoria, quindi l'utilizzo di tali informazioni per nuovi scopi non è un problema.

Sospetto che i sistemi mobili non stiano facendo le stesse cose dietro le quinte. Di conseguenza, non hanno lo stesso livello di informazioni di un desktop. Di conseguenza, le spese generali connesse all'attuazione di una raccolta generale sono più elevate e hanno meno probabilità di valerne la pena.


Sfruttare al massimo le generazioni GC richiede l'uso di recinti di scrittura per rilevare quando vengono scritti oggetti di vecchia generazione. D'altra parte, anche se la parte "mark" del GC non potesse beneficiare delle generazioni, penso che si potrebbe ancora migliorare le prestazioni spostando le cose solo nelle nuove generazioni (in realtà, facendo la fase "tag" sulle generazioni più vecchie come così come i più recenti potrebbero essere utili se permettessero di sapere quanta memoria recuperabile esistesse in ogni generazione).
supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.