Tamaños inicial y máximo del almacenamiento dinámico

Comprender las operaciones del recopilador de basura ayuda a establecer los tamaños inicial y máximo del almacenamiento dinámico para gestionarlo eficazmente.

El recopilador de basura adapta el tamaño de almacenamiento dinámico para mantener la ocupación entre 40 % y 70 % para las siguientes razones:
  • Una ocupación de almacenamiento dinámico mayor que 70 % causa más ciclos de GC frecuentes, lo que puede reducir el rendimiento. Puede modificar este comportamiento estableciendo la opción -Xminf.
  • Una ocupación del almacenamiento dinámico de menos de 40 % significa ciclos de GC poco frecuentes. Sin embargo, estos ciclos son más grandes que lo necesario, lo que crea tiempos de pausa más grandes, que pueden reducir el rendimiento. Puede modificar este comportamiento estableciendo la opción -Xmaxf.
Si no establece un tamaño de almacenamiento dinámico inicial o máximo, el GC expande y contrae el almacenamiento intermedio según sea necesario. Sin embargo, si arregla el tamaño de almacenamiento dinámico utilizando las opciones -Xms y -Xmx , la GC no expande ni reduce el almacenamiento dinámico de Java™ . Para optimizar el rendimiento de la aplicación y mantenerse dentro del rango de 40 al 70 %, el valor de tamaño de almacenamiento dinámico máximo debe ser, al menos, un 43 % mayor que la ocupación máxima de la aplicación. Por ejemplo, si una aplicación tiene una ocupación máxima de 70 MB, se debería establecer un tamaño de almacenamiento dinámico máximo de 100 MB, tal como se muestra en el siguiente cálculo:
70 + (70 * 43/100)

El establecimiento del tamaño de almacenamiento dinámico mínimo y máximo en el mismo valor no es una buena idea porque la recogida de basura se retrasa hasta que esté lleno el almacenamiento dinámico. Por lo tanto, la primera vez que se ejecuta el recopilador de basura, el procesador puede tardar más tiempo. Asimismo, es probable que el almacenamiento dinámico se fragmente y necesite compactarse. Inicie la aplicación con el tamaño de almacenamiento dinámico mínimo que la aplicación necesita. Cuando se inicie el GC, se ejecutará con frecuencia y eficacia debido a que el almacenamiento dinámico es pequeño.

Si el recopilador de basura (GC) no puede encontrar bastante basura, ejecuta la compactación. Si el recopilador de basura encuentra suficiente basura, o se cumple alguna de las otras condiciones para la expansión del almacenamiento dinámico (consulte Asignación de almacenamiento dinámico en la documentación de usuario deOpenJ9), el recopilador de basura amplía el almacenamiento dinámico.

Por lo tanto, una aplicación suele ejecutarse hasta que el almacenamiento dinámico está lleno. A continuación, los ciclos de recopilación de basura sucesivos recuperan la basura. Cuando el almacenamiento dinámico está lleno de objetos activos, el recopilador de basura lo compacta. Si todavía no se ha recuperado basura suficiente, el recopilador de basura expande el almacenamiento dinámico.

En la descripción anterior, puede ver que el recopilador de basura compacta el almacenamiento dinámico a medida que aumentan las necesidades de la aplicación, de tal forma que a medida que el almacenamiento dinámico se expande, se expande con un conjunto de objetos compactados al final del almacenamiento dinámico original. Este proceso es una forma eficaz de gestionar el almacenamiento dinámico porque la compactación se ejecuta en el tamaño de GC almacenamiento dinámico más pequeño posible en el momento en que se detecta que la compactación es necesaria. Esta compactación se lleva a cabo con los tamaños de almacenamiento dinámico mínimos ya que el almacenamiento dinámico crece. Existen algunas pruebas evidentes de que el conjunto inicial de objetos de una aplicación tiende a ser el conjunto raíz o clave, por lo que si se compactan antes se libera el resto del almacenamiento dinámico de objetos de corta duración.

Al final la máquina virtual Java tiene el almacenamiento dinámico de tamaño máximo con todos los objetos de corta duración compactados al final. La compactación se realizó cuando la compactación estaba en la fase menos costosa. La cantidad de proceso y de utilización de memoria necesarios para expandir el almacenamiento dinámico es prácticamente insignificante en comparación con el coste de recopilar y compactar un almacenamiento dinámico fragmentado muy grande.