Estoy pensando en aplicaciones científicas que en su mayoría están vinculadas al procesador y son muy pesadas en el uso del montón (al menos varios gigabytes). En cualquier otro momento del año, me encantaría ir con C ++, pero en este caso me pregunto si la fragmentación natural del administrador de memoria de C ++ puede ser un problema grave frente a la ventaja de los colectores de compactación de Java.
¿Alguien puede señalar ejemplos del mundo real relacionados con esto?
Respuestas:
Si está hablando de una aplicación que seguramente enfatizará los límites de la máquina, de modo que espera que haga trucos de programación para evitar exceder esos límites, entonces C ++ es el camino a seguir. No solo C ++ le da espacio para la optimización donde Java no lo hace (como señaló Emilio), sino que también los recolectores de basura son artilugios muy hambrientos de memoria que necesitan mucha memoria adicional para funcionar de manera eficiente.
Las respuestas a esta pregunta: StackOverflow: ¿Cuánta memoria adicional requiere la recolección de basura ? pintar una imagen bastante sombría, pero incluso si los recolectores de basura necesitan que la memoria libre sea tan grande como la memoria asignada, (que es lo que había escuchado), esto todavía significa que con Java todavía necesitarás mucha memoria libre para que funcione de manera eficiente.
Por otro lado, hoy en día generalmente preferimos comprar hardware más costoso que tener que realizar trucos de programación para evitar exceder los límites del hardware. En su caso, sus problemas de RAM normalmente se resolverían utilizando una máquina de 64 bits y agregando tantos módulos de RAM como sea necesario. Usted ve, el costo del hardware no está ni cerca del costo del tiempo de desarrollo en el mundo desarrollado hoy en día.
Creo que debería considerar seriamente esta opción, y si es posible, opte por esta opción y con Java en lugar de C ++, porque es mucho más fácil desarrollar algo en Java que en C ++, y seguir manteniéndolo después.
fuente
El problema no es usar C ++ ya que es Java y no usar Java ya que es C ++. Normalmente se implementa un contenedor C ++ para evitar el exceso de fragmentación, al igual que lo hace la tienda gratuita de Java.
Pero si se asigna la memoria directamente, también puede hacer cosas que Java no le permite hacer, lo que puede resultar en fragmentación.
La solución adecuada (en C ++) es usar contenedores y punteros inteligentes a través de clases de asignación que gestionan la asignación mediante "plexos" fijos (el punto clave, aquí, es escribir una buena clase de asignación). Y este es un estilo de programación que no tiene nada que ver con Java, por lo que cualquier comparación no tiene sentido.
[EDITAR] Esta puede ser una muestra desactualizada: asignación fija
fuente
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.
fuente