Su colega no tiene idea de lo que están hablando.
Su operación más costosa sería escucharlos . Perdieron su tiempo dirigiéndolo a información que está desactualizada hace más de una década (a partir de la fecha original en que se publicó esta respuesta) , además de tener que dedicar tiempo a publicar aquí e investigar en Internet. por la verdad
Esperemos que solo estén regurgitando ignorantemente algo que escucharon o leyeron hace más de una década y no sepan nada mejor. Tomaría cualquier otra cosa que digan como sospechosa también, esto debería ser una falacia bien conocida por cualquier persona que se mantenga actualizada de cualquier manera.
Todo es un objeto (excepto primitives
)
Todo lo que no sea primitivos ( int, long, double
, etc.) son Objetos en Java. No hay manera de evitar la creación de objetos en Java.
La creación de objetos en Java debido a sus estrategias de asignación de memoria es más rápida que C ++ en la mayoría de los casos y para todos los propósitos prácticos, en comparación con todo lo demás en la JVM, puede considerarse "libre" .
A principios de la década de los 90, a principios de la década de 2000, las implementaciones de JVM tenían cierta sobrecarga de rendimiento en la asignación real de Objetos. Este no ha sido el caso desde al menos el 2005.
Si ajusta -Xms
para que sea compatible con toda la memoria que necesita para que su aplicación se ejecute correctamente, es posible que el GC nunca tenga que ejecutar y barrer la mayor parte de la basura en las implementaciones modernas de GC, los programas de corta duración nunca podrán hacerlo. .
No intenta maximizar el espacio libre, que de todos modos es una pista falsa, maximiza el rendimiento del tiempo de ejecución. Si eso significa que el JVM Heap está casi el 100% asignado todo el tiempo, que así sea. La memoria de almacenamiento dinámico de JVM gratuita no te da nada, simplemente estar allí sentado de todos modos.
Hay una idea errónea de que el GC liberará la memoria al resto del sistema de una manera útil, ¡esto es completamente falso!
El montón de JVM no crece y se contrae, por lo que el resto del sistema se ve afectado positivamente por la memoria libre en el montón de JVM . -Xms
asigna TODO lo que se especifica en el inicio y su heurística es nunca devolver realmente ninguna parte de esa memoria al sistema operativo para compartirla con ningún otro proceso del sistema operativo hasta que la instancia de la JVM se cierre por completo. -Xms=1GB -Xmx=1GB
asigna 1 GB de RAM independientemente de cuántos objetos se creen realmente en un momento dado. Hay algunas configuraciones que permiten que se liberen porcentajes de la memoria del montón, pero para todos los propósitos prácticos la JVM nunca puede liberar suficiente memoria para que esto ocurra , por lo que ningún otro proceso puede reclamar esta memoria, por lo que el resto del sistema tampoco se beneficia de que la JVM Heap sea gratuita . Una RFE para esto fue "aceptada" 29-NOV-2006, pero nunca se ha hecho nada al respecto. Este comportamiento no es considerado una preocupación por ninguna persona con autoridad.
Hay una idea errónea de que la creación de muchos objetos pequeños de corta duración hace que la JVM se detenga durante largos períodos de tiempo, esto también es falso
Los algoritmos GC actuales en realidad están optimizados para crear muchos objetos pequeños de corta duración, que es básicamente la heurística del 99% para objetos Java en cada programa. Los intentos de agrupación de objetos en realidad harán que la JVM funcione peor en la mayoría de los casos.
Los únicos Objetos que necesitan agrupación hoy son Objetos que se refieren a recursos finitos que son externos para la JVM; Sockets, archivos, conexiones de base de datos, etc. y pueden ser reutilizados. Los objetos normales no se pueden agrupar en el mismo sentido que en los idiomas que le permiten acceder directamente a las ubicaciones de la memoria. El almacenamiento en caché de objetos es un concepto diferente y puede o no ser lo que algunas personas llaman ingenuamente agrupamiento , los dos conceptos no son lo mismo y no deben combinarse.
Los algoritmos modernos de GC no tienen este problema porque no se asignan de manera programada, se asignan cuando se necesita memoria libre en una generación determinada. Si el montón es lo suficientemente grande, entonces no se producen desasignaciones lo suficientemente largas como para causar pausas.
Los lenguajes dinámicos orientados a objetos están superando a C incluso hoy en día en datos confidenciales pruebas.