La ventaja de la recolección de basura es que simula una máquina con una cantidad infinita de memoria. El mecanismo o implementación de esa abstracción pretende ser completamente transparente para usted como programador. Todos sabemos que el mecanismo está recuperando memoria que el programa ya no usa, pero que en realidad no está garantizada. Si ejecuta el programa en una máquina con más RAM de la que el programa realmente utiliza, entonces la recolección de basura puede que nunca ocurra. Nuevamente, irrelevante, porque puedes escribir el programa sin importar cómo usa la memoria. El administrador de memoria solo asignará más RAM cada vez que el programa lo solicite, y se le permite suponer que tales asignaciones siempre tendrán éxito. Java es un lenguaje recolectado de basura, y C ++ no lo es. 1
La desventaja de la recolección de basura es que, como todas las abstracciones , tiende a tener fugas. No siempre funciona perfectamente todo el tiempo, especialmente en casos extremos, y es probable que te encuentres con errores. Las personas que escribieron el algoritmo de recolección de basura (el que se supone que es transparente para usted como programador) optimizado para los casos más comunes, y el problema con los casos comunes es que nunca son tan comunes. En general , no puede hacer nada mejor que el recolector de basura en la gestión de la memoria. Pero en circunstancias específicas (y dada una cantidad suficiente de tiempo, energía y comprensión), podría ser posible. C ++ le brinda esta flexibilidad; Java no lo hace.
Dicho todo esto, creo que el consejo estándar para elegir un idioma se aplica aquí, quizás aún más en este caso dadas las limitaciones. Elija el idioma que sea más familiar para los desarrolladores principales del proyecto. Además de las razones obvias (como que podrá desarrollar la aplicación más rápido y de manera más eficiente), esto es particularmenteimportante en el caso que describa porque programar C ++ como si estuviera programando Java resultará en prácticas de administración de memoria terriblemente ineficaces y, por lo tanto, fugas y fallas. De manera análoga, programar en Java como si estuvieras programando en C ++ no te va a hacer mucho bien, y puede terminar produciendo un programa menos que optimizado, dado que los algoritmos de recolección de basura están ajustados y ajustados para los casos más comunes .
Los programadores que están acostumbrados a trabajar en lenguajes recolectados de basura aprenden a confiar en el recolector de basura, en lugar de luchar contra él. Si está trabajando en un lenguaje de recolección de basura, estos son los programadores que desea en su proyecto. Programadores que no sonacostumbrados a trabajar en un lenguaje recolectado de basura, son intrínsecamente escépticos de tal abstracción de "memoria infinita", y con frecuencia con muchas buenas razones. A pesar de lo buenos que pueden ser estos programadores, estos no son los que desea trabajar en un lenguaje recolectado de basura porque estarán luchando contra el GC en cada paso del camino, constantemente cuestionándolo y a menudo produciendo una memoria más lenta y menos eficiente código que el otro tipo de programador. En el mejor de los casos, pasarán mucho tiempo reinventando la rueda, lo que le costará mucho dinero e incluso más en costos de mantenimiento a largo plazo.
Y luego también debe preguntarse si realmente importa. Hay más que un indicio de verdad en el comentario sarcástico de Bo: la memoria es tan barata ahora que apenas vale la pena exprimirla demasiado. Incluso si necesita cantidades masivas , esas cantidades no son tan masivas ahora como lo fueron hace 10 años. Los programadores y el desarrollo de aplicaciones son mucho más caros que solo comprar grandes cantidades de RAM y potencia de procesamiento. Eso no significa que deba evitar la economía donde sea posible, pero sí significa que tampoco debe perder demasiado tiempo haciéndolo.
1 Por supuesto, esta suposición destaca un defecto más profundo en la pregunta. Como resultado, "Java o C ++" es un poco una pista falsa. La implementación estándar de Java proporciona recolección de basura y C ++ no cumple con el estándar de lenguaje, pero no hay absolutamente ninguna razón por la que no pueda usar un recolector de basura de terceros para C ++. Muchas empresas se han ganado la vida vendiendo estas cosas, y algunas probablemente se han ganado la vida regalándolas gratuitamente.