A vantagem da coleta de lixo é que ela simula uma máquina com uma quantidade infinita de memória. O mecanismo ou implementação dessa abstração pretende ser completamente transparente para você como programador. Todos sabemos que o mecanismo está recuperando a memória que não é mais usada pelo programa, mas que não é realmente garantida. Se você executar o programa em uma máquina com mais RAM do que o programa realmente usa, a coleta de lixo poderá nunca ocorrer. Novamente, irrelevante, porque você pode simplesmente escrever o programa sem levar em consideração como ele usa memória. O gerenciador de memória apenas alocará mais RAM sempre que o programa solicitar, e você poderá assumir que essas alocações sempre serão bem-sucedidas. Java é uma linguagem de coleta de lixo e C ++ não. 1
A desvantagem da coleta de lixo é que, como todas as abstrações , ela tende a vazar. Nem sempre funciona perfeitamente o tempo todo, principalmente em casos extremos, e é provável que você encontre bugs. As pessoas que criaram o algoritmo de coleta de lixo (aquele que deveria ser transparente para você como programador) foram otimizadas para os casos mais comuns, e o problema com casos comuns é que eles nunca são tão comuns. Em geral , você não pode fazer melhor do que o coletor de lixo no gerenciamento de memória. Mas em circunstâncias específicas (e com uma quantidade suficiente de tempo, energia e compreensão), isso pode ser possível. C ++ oferece essa flexibilidade; Java não.
Tudo isso dito, acho que o conselho padrão para a escolha de um idioma se aplica aqui, talvez ainda mais neste caso, dadas as restrições. Escolha o idioma que é o mais familiar para os desenvolvedores principais do projeto. Além dos motivos óbvios (como você poderá desenvolver o aplicativo com mais rapidez e eficiência), isso é particularmenteimportante no caso que você descreve, porque programar C ++ como você está programando Java resultará em práticas de gerenciamento de memória terrivelmente ineficazes e, portanto, vazará e trará falhas. Analogamente, programar em Java como você está programando em C ++ não fará muito bem e pode acabar produzindo um programa menos que otimizado, já que os algoritmos de coleta de lixo são aprimorados e ajustados para os casos mais comuns .
Os programadores que estão acostumados a trabalhar em idiomas coletados pelo lixo aprendem a confiar no coletor de lixo, em vez de lutar contra ele. Se você estiver trabalhando em uma linguagem de coleta de lixo, estes são os programadores que você deseja no seu projeto. Programadores que não sãoacostumado a trabalhar em uma linguagem de coleta de lixo é inerentemente cético em relação a essa abstração de "memória infinita" e frequentemente com muitas boas razões. Por mais bons que sejam esses programadores, não são esses que você deseja trabalhar em uma linguagem de coleta de lixo, porque eles estarão lutando contra o GC a cada passo do caminho, constantemente adivinhando-o e produzindo frequentemente mais lento e menos eficiente em termos de memória código que o outro tipo de programador. Na melhor das hipóteses, eles gastam muito tempo reinventando a roda, custando muito dinheiro e ainda mais em custos de manutenção a longo prazo.
E então você também precisa se perguntar se isso realmente importa. Há mais do que uma pitada de verdade no comentário sarcástico de Bo: a memória é tão barata agora, dificilmente vale muito a pena. Mesmo se você precisar de grandes quantidades, essas quantias não são tão grandes agora como eram há 10 anos. Programadores e desenvolvimento de aplicativos são muito mais caros do que apenas comprar grandes quantidades de RAM e poder de processamento. Isso não significa que você deve evitar a economia sempre que possível, mas também não deve perder muito tempo fazendo isso.
1 Obviamente, essa suposição destaca uma falha mais profunda na questão. Como se vê, "Java ou C ++" é um arenque vermelho. A implementação Java padrão fornece coleta de lixo e o C ++ não atende ao padrão da linguagem, mas não há absolutamente nenhuma razão para que você não possa usar um coletor de lixo de terceiros para o C ++. Muitas empresas ganharam a vida vendendo essas coisas, e algumas provavelmente ganharam a vida dando-as de graça.