Il vantaggio della garbage collection è che simula una macchina con una quantità infinita di memoria. Il meccanismo o l'implementazione di tale astrazione dovrebbe essere completamente trasparente per te come programmatore. Sappiamo tutti che il meccanismo sta recuperando la memoria che non è più utilizzata dal programma, ma in realtà non è garantita. Se si esegue il programma su una macchina con più RAM di quella che il programma effettivamente utilizza, la garbage collection potrebbe non avvenire mai. Ancora una volta, irrilevante, perché puoi semplicemente scrivere il programma indipendentemente da come usa la memoria. Il gestore della memoria assegnerà più RAM ogni volta che il programma lo richiede e si può presumere che tali allocazioni avranno sempre successo. Java è un linguaggio spazzatura e C ++ no. 1
Lo svantaggio della raccolta dei rifiuti è che, come tutte le astrazioni , tende a perdere. Non sempre funziona perfettamente tutto il tempo, in particolare nei casi limite, e probabilmente ti imbatterai in bug. Le persone che hanno scritto l'algoritmo di garbage collection (quello che dovrebbe essere trasparente per te come programmatore) ottimizzato per i casi più comuni, e il problema con i casi comuni è che non sono mai così comuni. In generale , non è possibile fare di meglio di Garbage Collector nella gestione della memoria. Ma in circostanze specifiche (e data una quantità sufficiente di tempo, energia e comprensione), potrebbe essere possibile. C ++ ti offre questa flessibilità; Java no.
Detto questo, penso che i consigli standard per la scelta di una lingua si applichino qui, forse ancora di più in questo caso, dati i vincoli. Scegli la lingua più familiare agli sviluppatori principali per il progetto. Oltre alle ovvie ragioni (come se sarai in grado di sviluppare l'app più velocemente e in modo più efficiente), questo è particolarmenteimportante nel caso in cui descrivi perché programmare C ++ come stai programmando Java si tradurrà in pratiche di gestione della memoria terribilmente inefficaci, e quindi perdite e arresti anomali. Analogamente, programmare in Java come se stessi programmando in C ++ non ti farà molto bene e potrebbe finire per produrre un programma poco ottimizzato, dato che gli algoritmi di Garbage Collection sono ottimizzati e ottimizzati per i casi più comuni .
I programmatori che sono abituati a lavorare in lingue raccolte di immondizia imparano a fidarsi del garbage collector, piuttosto che a lottare contro di esso. Se stai lavorando in un linguaggio spazzatura, questi sono i programmatori che desideri sul tuo progetto. Programmatori che non lo sonoabituati a lavorare in un linguaggio raccolto dall'immondizia sono intrinsecamente scettici nei confronti di un'astrazione di "memoria infinita" e spesso con molte buone ragioni. Per quanto buoni possano essere questi programmatori, questi non sono quelli che vorresti lavorare in un linguaggio spazzatura perché combatteranno contro il GC in ogni fase del percorso, indovinandolo costantemente in secondo luogo e spesso producendo più lento, meno efficiente in termini di memoria codice rispetto all'altro tipo di programmatore. Nella migliore delle ipotesi, passeranno solo un sacco di tempo a reinventare la ruota, costando un sacco di soldi e ancora di più in costi di manutenzione a lungo termine.
E poi devi anche chiederti se è davvero importante. C'è più di un pizzico di verità nel commento sdolcinato di Bo: la memoria è così economica adesso, non vale quasi la pena strizzare troppo la mano. Anche se hai bisogno di enormi quantità, tali importi non sono così massicci ora come lo erano 10 anni fa. I programmatori e lo sviluppo di applicazioni sono molto più costosi di un semplice acquisto di RAM e potenza di elaborazione. Ciò non significa che dovresti evitare l'economia dove possibile, ma significa che non dovresti perdere troppo tempo a farlo, neanche.
1 Naturalmente, questo presupposto evidenzia un difetto più profondo nella domanda. A quanto pare, "Java o C ++" è un po 'un'aringa rossa. L'implementazione standard di Java fornisce Garbage Collection e C ++ non è conforme allo standard linguistico, ma non c'è assolutamente alcun motivo per cui non è possibile utilizzare un Garbage Collector di terze parti per C ++. Molte aziende si sono guadagnate da vivere vendendo queste cose e alcune probabilmente si sono guadagnate da vivere regalandole gratuitamente.