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.
java
.net
android
windows-phone-7
garbage-collection
Rei Miyasaka
fonte
fonte
Respostas:
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.
fonte
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 .
fonte
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.
fonte