Por que as plataformas móveis não oferecem suporte à coleta de lixo geracional?


11

O Windows Phone / Xbox e o Android não têm suporte para coleta de lixo de gerações. Isso é frustrante para muitos programadores. Parece haver uma razão legítima de engenharia, mas não consigo descobrir.

Os telefones atuais têm mais memória e provavelmente melhores CPUs do que os desktops / laptops executando o .NET 1.1 com GC geracional em 2001, e não consigo pensar em nenhum motivo pelo qual os processadores ARM seriam piores no GC geracional do que o x86. Também há menos necessidade de multitarefa em telefones e consoles; portanto, há relativamente mais espaço livre na pilha.

Então, o que dá?

Editar: Alguns pontos para esclarecer:

  • Essas plataformas usam a coleta de lixo exclusivamente para aplicativos, então minha pergunta não é sobre por que o GC não é suportado; minha pergunta é sobre por que a coleta de lixo geracional não é.
  • A razão pela qual as pessoas estão frustradas com a falta de GC geracional é que o GC não-genracional é extremamente ineficiente. (Isso significa que a duração da bateria não é a razão.)
  • Eu acredito que há uma razão técnica honesta para a falta de suporte geracional do GC. Esta não é uma pergunta retórica.

O Windows phone (a geração atual) tem coleta de lixo. Ele só funciona quando o dispositivo está com pouca memória msdn.microsoft.com/en-us/library/gg490770.aspx
Tom Squires

@TomSquires O GC no WP7 é executado uma vez a cada 1 MB de alocações, na verdade. Eu acho que você pode estar pensando sobre o gerenciador de tarefas usando processos antigos.
Rei Miyasaka

Respostas:


5

Eu acho que o maior problema é a vida da bateria. A coleta de lixo é uma conveniência de desenvolvedor comprada pelo preço de ciclos adicionais de CPU no computador do usuário . Quando sua CPU está conectada (desktop) ou possui uma bateria relativamente grande (laptop), seus usuários estão mais dispostos a pagar pela conveniência dos desenvolvedores com a energia adicional consumida pela CPU durante a coleta de lixo. Quando a bateria é relativamente pequena, os usuários podem não ser tão generosos. Eles podem querer essa barra adicional para si mesmos - talvez conversar com seus amigos ou matar alguns porcos extras em um encontro mortal com pássaros raivosos.

Independentemente das razões dos usuários, os desenvolvedores de sistemas operacionais não desejam formar uma percepção de que os dispositivos que executam seu sistema operacional consomem mais bateria do que aqueles que executam o sistema operacional do concorrente. Assim, eles compram uma melhor percepção do tempo de vida útil da bateria esperado de seus dispositivos ao preço da conveniência dos desenvolvedores: para eles, sua dor não é grande coisa, desde que os usuários estejam satisfeitos com os dispositivos.


3
O GC geracional é muito mais eficiente na maioria dos casos, na verdade, então você pensaria que reduziria o número de ciclos de clock. Ele também não explica por que algo como Xbox não tem GC geracional, porque Xboxes estão conectados.
Rei Miyasaka

Bem, foi o que ouvi no Stack Overflow. Eu não sei muito sobre XBox-es, no entanto.
dasblinkenlight

3
Isso ainda não responde à pergunta. Mesmo que a coleta de lixo tenha usado mais poder do que a alocação explícita (que é altamente discutível - e eu não vou entrar nisso), a questão não é se / por que a alocação explícita é melhor que a GC no celular, é se / por que não- o GC geracional é melhor que o GC geracional no celular.
Rei Miyasaka

1
@Rei: os jogos normalmente exigem que tudo seja determinístico; pelo menos, eles precisam de desempenho previsível. Alguns nanossegundos desperdiçados aqui e alguns nanossegundos desperdiçados ali - em momentos imprevisíveis - podem estragar uma experiência de jogo. Coletores de lixo geracionais são imprevisíveis.
Ant

2
@djacobson Eu não acho que isso seja verdade. Como eu disse na pergunta, se fossem apenas as plataformas da Microsoft negligenciando o GC geracional, provavelmente seria apenas uma razão logística / burocrática, e eu não me incomodaria em perguntar. Mas o Android também sofre o mesmo problema, por isso é provavelmente uma razão técnica, o que significa que alguém no P.SE pode ter uma resposta definitiva.
Rei Miyasaka

3

Meu melhor palpite seria que não é uma razão técnica, mas que os desenvolvedores dessas plataformas telefônicas simplesmente ainda não se esforçaram. Eu sei que não é a resposta que você está esperando, mas se você fez algum desenvolvimento móvel, provavelmente já percebeu que há muitas frutas baixas. Eles provavelmente simplesmente não tiveram tempo de escrever várias implementações de GC, ajustá-las todas e selecionar a que melhor se adequa. Por que alguém gastaria tempo reinventando a roda quando, em vez disso, poderia lançar novas APIs chamativas e mal pensadas? ;)

FWIW, e como confirmação da minha teoria, o novo tempo de execução do Android (ART) tem um GC de gerações e eles planejam ter um GC de compactação no futuro .


2

Há algum custo adicional para a coleta de lixo geracional.

O coletor de gerações precisa descobrir quando objetos mais antigos apontam para objetos mais novos. Não podemos rastrear o objeto mais antigo para encontrar esses casos, porque isso anularia o objetivo da coleção geracional. Em vez disso, precisamos detectar de alguma forma quando isso acontece e anotar na fase de coleta. Independentemente de como você fará isso, isso adicionará alguma sobrecarga ao processo de coleta.

Em um sistema desktop, seu sistema operacional está ocupado fazendo todo tipo de coisas com memória nos bastidores. Ele suporta recursos como compartilhar páginas entre processos, gravar páginas não utilizadas no disco, fornecer mapeamento de memória entre processos, etc. Meu entendimento é que algumas das funcionalidades usadas ali possibilitam rastrear com mais eficiência os ponteiros que estão sendo alterados. A operação já está preocupada com o que você está alterando na memória, portanto, usar essas informações para novos propósitos não é um problema.

Suspeito que os sistemas móveis não estejam fazendo as mesmas coisas nos bastidores. Como resultado, eles não têm o mesmo nível de informação que um desktop teria. Em conseqüência, a sobrecarga envolvida na implementação de uma coleção geral é maior e tem menor probabilidade de valer a pena.


Tirar o máximo proveito das gerações do GC requer o uso de cercas de gravação para detectar quando objetos da geração mais antiga são gravados. Por outro lado, mesmo que a parte "marca" do GC não pudesse se beneficiar de gerações, eu pensaria que ainda seria possível melhorar o desempenho apenas movendo coisas nas gerações mais novas (na verdade, fazendo a fase "marca" nas gerações mais velhas como bem como as mais recentes, poderiam ser úteis se permitissem saber quanta memória recuperável existia em cada geração).
30812
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.