L'avantage du garbage collection est qu'il simule une machine avec une quantité infinie de mémoire. Le mécanisme ou l'implémentation de cette abstraction est destiné à être complètement transparent pour vous en tant que programmeur. Nous savons tous que le mécanisme récupère de la mémoire qui n'est plus utilisée par le programme, mais ce n'est pas réellement garanti. Si vous exécutez le programme sur une machine avec plus de RAM que le programme n'en utilise jamais, le garbage collection peut ne jamais se produire. Encore une fois, non pertinent, car vous pouvez simplement écrire le programme sans égard à la façon dont il utilise la mémoire. Le gestionnaire de mémoire allouera simplement plus de RAM chaque fois que le programme le demandera, et vous pouvez supposer que de telles allocations réussiront toujours. Java est un langage récupéré, et C ++ ne l'est pas. 1
L'inconvénient de la récupération de place est que, comme toutes les abstractions , elle a tendance à fuir. Cela ne fonctionne pas toujours parfaitement tout le temps, en particulier dans les cas marginaux, et vous risquez de rencontrer des bugs. Les personnes qui ont écrit l'algorithme de récupération de place (celui qui est censé être transparent pour vous en tant que programmeur) optimisé pour les cas les plus courants, et le problème avec les cas courants, c'est qu'ils ne sont jamais si communs. En général , vous ne pouvez pas faire mieux que le garbage collector pour gérer la mémoire. Mais dans des circonstances spécifiques (et avec suffisamment de temps, d'énergie et de compréhension), cela pourrait être possible. C ++ vous donne cette flexibilité; Java ne le fait pas.
Cela dit, je pense que le conseil standard pour le choix d'une langue s'applique ici, peut-être encore plus dans ce cas, compte tenu des contraintes. Choisissez la langue la plus familière aux développeurs principaux du projet. En plus des raisons évidentes (comme vous pourrez développer l'application plus rapidement et plus efficacement), c'est particulièrementimportant dans le cas que vous décrivez parce que la programmation C ++ comme vous programmez Java va entraîner des pratiques de gestion de la mémoire terriblement inefficaces, et donc des fuites et des plantages. De façon similaire, la programmation en Java comme vous le faites en C ++ ne vous fera pas grand bien, et pourrait finir par produire un programme moins qu'optimisé, étant donné que les algorithmes de récupération de place sont ajustés et ajustés pour les cas les plus courants .
Les programmeurs habitués à travailler dans des langages récupérés apprennent à faire confiance au garbage collector, plutôt que de lutter contre lui. Si vous travaillez dans un langage récupéré, ce sont les programmeurs que vous souhaitez sur votre projet. Programmeurs qui ne sont pashabitués à travailler dans un langage récupéré sont intrinsèquement sceptiques à l'égard d'une telle abstraction de "mémoire infinie", et souvent avec de nombreuses bonnes raisons. Aussi bons que ces programmeurs puissent être, ce ne sont pas ceux que vous souhaitez travailler dans un langage récupéré car ils se battront contre le GC à chaque étape du processus, le devineront constamment et produiront souvent plus lentement, moins économes en mémoire code que l'autre type de programmeur. Au mieux, ils passeront juste beaucoup de temps à réinventer la roue, vous coûteront beaucoup d'argent et encore plus en coûts de maintenance à long terme.
Et puis vous devez également vous demander si cela compte vraiment. Il y a plus qu'un soupçon de vérité dans le commentaire sarcastique de Bo: la mémoire est si bon marché maintenant, elle ne vaut guère trop de se tordre la main. Même si vous avez besoin de montants massifs , ces montants ne sont plus aussi massifs maintenant qu'ils l'étaient il y a 10 ans. Les programmeurs et le développement d'applications coûtent beaucoup plus cher que l'achat de quantités de RAM et de puissance de traitement. Cela ne signifie pas que vous devez éviter l'économie dans la mesure du possible, mais cela signifie également que vous ne devriez pas perdre trop de temps à le faire.
1 Bien entendu, cette hypothèse met en évidence une faille plus profonde dans la question. Il s'avère que "Java ou C ++" est un peu un hareng rouge. L'implémentation Java standard fournit le ramasse-miettes et C ++ ne le fait pas selon la norme de langage, mais il n'y a absolument aucune raison que vous ne puissiez pas utiliser un ramasse-miettes tiers pour C ++. Beaucoup d'entreprises ont gagné leur vie en vendant ces choses, et certaines ont probablement gagné leur vie en les donnant gratuitement.