Il vantaggio della garbage collection è che simula una macchina con una quantità infinita di memoria. Il meccanismo o l'implementazione di tale astrazione è destinato a essere completamente trasparente per te come programmatore. Sappiamo tutti che il meccanismo sta recuperando la memoria che non è più utilizzata dal programma, ma non è in realtà garantita. Se si esegue il programma su una macchina con più RAM rispetto a quella effettivamente utilizzata dal programma, la raccolta di dati inutili potrebbe non avvenire mai. Di nuovo, irrilevante, perché puoi semplicemente scrivere il programma senza riguardo a come usa la memoria. Il gestore della memoria assegna solo più RAM ogni volta che il programma lo richiede, e ti è permesso assumere che tali allocazioni avranno sempre successo. Java è un linguaggio garbage-collected e C ++ no. 1
Lo svantaggio della garbage collection è che, come tutte le astrazioni , tende a perdere. Non sempre funziona perfettamente tutto il tempo, in particolare nei casi limite, ed è probabile che vi imbattete 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 casi comuni è che non sono mai così comuni. In generale , non puoi fare meglio di quanto possa fare il 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 dà questa flessibilità; Java no.
Tutto ciò detto, penso che il consiglio standard per la scelta di una lingua si applichi qui, forse anche di più in questo caso dati i vincoli. Scegli il linguaggio che è più familiare per gli sviluppatori primari del progetto. Oltre alle ovvie ragioni (come la possibilità di sviluppare l'app in modo più rapido ed efficiente), questo è particolarmente importante nel caso che descrivi perché programmare C ++ come se stessi programmando Java porterà a pratiche di gestione della memoria terribilmente inefficaci, e quindi a perdite e arresti anomali. Analogamente, programmare in Java come si sta programmando in C ++ non ti farà molto bene, e potrebbe finire per produrre un programma non ottimizzato, dato che gli algoritmi di garbage collection sono ottimizzati e ottimizzati per i casi più comuni .
I programmatori abituati a lavorare in lingue raccolte da garbage imparano a fidarsi del garbage collector, piuttosto che a lottare contro di esso. Se stai lavorando in una lingua raccolta dalla spazzatura, questi sono i programmatori che desideri sul tuo progetto. I programmatori che sono non abituati a lavorare in un linguaggio raccolto con garbage sono intrinsecamente scettici su una tale astrazione di "memoria infinita" e spesso con molte buone ragioni. Per quanto questi programmatori possano essere, questi non sono quelli che vuoi lavorare in un linguaggio spazzato via perché combatteranno contro il GC in ogni fase del processo, continuando a indovinare e producendo spesso meno memoria e meno efficienza codice diverso dall'altro tipo di programmatore. Nella migliore delle ipotesi, passeranno molto tempo a reinventare la ruota, costando un sacco di soldi e ancora di più con costi di manutenzione a lungo termine.
E poi devi anche chiedertelo se è davvero importante. C'è più di un accenno di verità al commento sniffato di Bo: la memoria è così a buon mercato ora, non vale la pena troppa torcitura. Anche se hai bisogno di importi massicci , tali importi non sono altrettanto elevati 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 anche che non dovresti perdere troppo tempo a farlo.
1 Naturalmente, questa ipotesi evidenzia un difetto più profondo nella domanda. A quanto pare, "Java o C ++" è un po 'una falsa pista. L'implementazione standard di Java fornisce la garbage collection e il C ++ non è conforme allo standard della lingua, ma non c'è assolutamente alcun motivo per cui non si possa usare 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.