Der Vorteil der Speicherbereinigung besteht darin, dass eine Maschine mit unendlich viel Speicher simuliert wird. Der Mechanismus oder die Implementierung dieser Abstraktion soll für Sie als Programmierer vollständig transparent sein. Wir alle wissen, dass der Mechanismus Speicher zurückfordert, der vom Programm nicht mehr verwendet wird, der jedoch nicht garantiert ist. Wenn Sie das Programm auf einem Computer mit mehr RAM ausführen, als das Programm jemals tatsächlich verwendet, wird die Speicherbereinigung möglicherweise nie durchgeführt. Auch dies ist irrelevant, da Sie das Programm einfach schreiben können, ohne Rücksicht darauf, wie es Speicher verwendet. Der Speichermanager weist einfach mehr RAM zu, wenn das Programm dies anfordert, und Sie können davon ausgehen, dass solche Zuweisungen immer erfolgreich sind. Java ist eine durch Müll gesammelte Sprache und C ++ nicht. 1
Der Nachteil der Speicherbereinigung besteht darin, dass sie wie alle Abstraktionen undicht ist. Es funktioniert nicht immer perfekt, insbesondere in Randfällen, und es ist wahrscheinlich, dass Sie auf Fehler stoßen. Die Leute, die den Garbage Collection-Algorithmus geschrieben haben (der für Sie als Programmierer transparent sein soll), sind für die häufigsten Fälle optimiert, und das Problem mit häufigen Fällen ist, dass sie nie so häufig sind. Im Allgemeinen können Sie beim Verwalten des Speichers nichts Besseres tun als der Garbage Collector. Aber unter bestimmten Umständen (und bei ausreichender Zeit, Energie und Verständnis) könnte dies möglich sein. C ++ bietet Ihnen diese Flexibilität. Java nicht.
Trotzdem denke ich, dass hier die Standardempfehlung für die Auswahl einer Sprache gilt, vielleicht sogar noch mehr in diesem Fall angesichts der Einschränkungen. Wählen Sie die Sprache aus, die den Hauptentwicklern für das Projekt am vertrautesten ist. Neben den offensichtlichen Gründen (wie Sie die App schneller und effizienter entwickeln können) ist dies besonders wichtigWichtig in dem von Ihnen beschriebenen Fall, da das Programmieren von C ++ wie das Programmieren von Java zu furchtbar ineffektiven Speicherverwaltungspraktiken und damit zu Undichtigkeiten und Abstürzen führen wird. Analog dazu wird das Programmieren in Java, wie Sie es in C ++ programmieren, nicht viel nützen und möglicherweise zu einem weniger als optimierten Programm führen, da die Garbage Collection-Algorithmen für die häufigsten Fälle optimiert und optimiert sind .
Programmierer, die es gewohnt sind, in von Müll gesammelten Sprachen zu arbeiten, lernen, dem Müllsammler zu vertrauen, anstatt dagegen zu kämpfen. Wenn Sie in einer Sprache arbeiten, in der Müll gesammelt wird, sind dies die Programmierer, die Sie für Ihr Projekt benötigen. Programmierer, die es nicht sindgewohnt, in einer von Müll gesammelten Sprache zu arbeiten, sind einer solchen "unendlichen Erinnerung" -Abstraktion von Natur aus skeptisch und häufig mit vielen guten Gründen. So gut diese Programmierer auch sein mögen, sie sind nicht die, die Sie in einer von Müll gesammelten Sprache arbeiten möchten, da sie bei jedem Schritt des Weges gegen den GC kämpfen, ihn ständig hinterfragen und oft langsamer und weniger speichereffizient produzieren Code als der andere Programmierertyp. Bestenfalls verbringen sie viel Zeit damit, das Rad neu zu erfinden, was Sie viel Geld und noch mehr langfristige Wartungskosten kostet.
Und dann müssen Sie sich auch fragen, ob es wirklich wichtig ist. Bo's abfälliger Kommentar enthält mehr als einen Hinweis auf die Wahrheit: Das Gedächtnis ist jetzt so billig, dass es kaum zu viel Handarbeit wert ist. Selbst wenn Sie massive Mengen benötigen , sind diese Mengen heute nicht annähernd so massiv wie vor 10 Jahren. Programmierer und Anwendungsentwicklung sind weitaus teurer als nur RAM und Rechenleistung zu kaufen. Das bedeutet nicht, dass Sie die Wirtschaft nach Möglichkeit meiden sollten, aber es bedeutet auch, dass Sie nicht zu viel Zeit damit verschwenden sollten.
1 Natürlich hebt diese Annahme einen tieferen Fehler in der Frage hervor. Wie sich herausstellt, ist "Java oder C ++" ein bisschen wie ein roter Hering. Die Standard-Java-Implementierung bietet Garbage Collection und C ++ entspricht nicht dem Sprachstandard, aber es gibt absolut keinen Grund, warum Sie keinen Garbage Collector eines Drittanbieters für C ++ verwenden könnten. Viele Unternehmen haben ihren Lebensunterhalt damit verdient, diese Dinge zu verkaufen, und einige haben wahrscheinlich ihren Lebensunterhalt damit verdient, sie kostenlos zu verschenken.