(Tenga en cuenta que cuando digo "JVM", me refiero a "hotspot", y estoy usando la última actualización de Java 1.6.)¿Alienta la JVM a GC en lugar de hacer crecer el montón?
situación Ejemplo:
Mi JVM está funcionando con el sistema -Xmx a 1 gb. Actualmente, el montón tiene 500mb asignados, de los cuales se utilizan 450mb. El programa necesita cargar otros 200 mb en el montón. Actualmente, hay 300 MB de basura "coleccionable" en el montón (asumiremos que está en la generación más antigua).
En condiciones normales de funcionamiento, la JVM aumentará el montón a 700 MB aproximadamente, y se recogerá la basura cuando llega el momento.
Lo que me gustaría en esa situación es que la JVM gc primero, luego asigne las cosas nuevas, de modo que terminemos con el tamaño de pila permaneciendo en 500mb, y el montón usado en 350mb.
¿Hay un combo de parámetros JVM que lo haga?
El concepto de que no hay necesidad de liberar la memoria no utilizada es, en mi opinión, el principal problema con los lenguajes de programación "modernos" de la actualidad. Comparto las preocupaciones de Electrons_Ahoy. Las computadoras ya no son más rápidas como solían, desafortunadamente. ¡Tenemos que escribir un mejor software! – Seba
Esa es la compensación si quieres olvidarte de la asignación de memoria, nada extraño ni nada que te prohíba usar C o C++ y administrar lo que quieras a mano. Pero si elige un entorno que se encargue de comportarse de la mejor manera por sí solo, entonces no debería intentar forzar su comportamiento. Su argumentación es en gran parte inútil ya que estamos en el contexto de Java, y nadie lo obliga a usarlo :) Es como discutir contra alguien con un gran vehículo contaminante, simplemente tome su bicicleta y olvídese de la contaminación. – Jack
Esto podría ser útil , en eso, un gc completo será más barato cuando el montón utilizado sea más pequeño. Si pudiera elegir entre "fullGC now-> recover 500M-> add 500M of new objects" y "add 500M-> trigger an automatic GC-> recover 500M", el primero sería más económico. Además, aunque los documentos establecen explícitamente que System.gc() se tomará como "una sugerencia", funciona como si se hubiera escrito como obligatorio en mi juego limitado. No es que sea necesariamente una buena idea: con un montón de 1G, un fullgc causará un bloqueo notable, al menos unos pocos segundos totalmente bloqueados. –