[AIX Solaris HP-UX Linux Windows]

Parámetros de ajuste de la JVM de Sun HotSpot (Solaris y HP-UX)

El ajuste de la JVM (máquina virtual Java™) de Sun HotSpot es un proceso iterativo en el que se desarrolla la configuración de la JVM, se recopilan datos (sobre todo los datos verbosegc) y, a continuación, se analizan. Luego se aplican las revisiones de la configuración en el ciclo siguiente.

Aunque hay muchos parámetros de la JVM de Sun HotSpot, los parámetros siguientes se han identificado como fundamentales para el ajuste. Los parámetros que modifique están en función de sus opciones de configuración. Por tanto, además de revisar estas descripciones de parámetros, puede leer acerca del ajuste de Sun HotSpot Java Virtual Machines (Solaris y HP-UX) para entender mejor la metodología de ajuste de la JVM.

Hay un formulario estándar en el que se especifican todas las opciones de Sun HotSpot. Es importante entender este formulario para ayudarle a evitar problemas al transcribir opciones, interpretar instrucciones y evitar la confusión potencial causada si la JVM rechaza una opción y no se inicia.

Debe preocuparse en concreto por las opciones de Sun HotSpot relativas a la implementación de la JVM de Sun HotSpot, empezando con la opción -XX, en lugar de con opciones VM estándar o portátiles, como la opción-X o la opción -. La mayoría de estas opciones son valores booleanos, es decir, que se establecen en true o false. Estos valores habilitan o inhabilitan una característica. El siguiente formulario estándar se utiliza para habilitar una opción, que es lo que se suele hacer al cambiar el valor de una opción durante el proceso de ajuste:
opción -XX:+
El siguiente formulario estándar se utiliza para inhabilitar una opción, que se hace con menos frecuencia:
opción -XX:-
Avoid trouble Avoid trouble:
  • La utilización de un signo más o de un signo menos debe especificarse inmediatamente después de un signo de dos puntos. En caso contrario, la opción suele requerir un valor y aparece más como la asignación de un valor porque tiene un formato opción=valor.
  • Como se indica en el sitio web de SUN, las opciones -XX de Hotspot están sujetas a modificaciones sin previo aviso en releases posteriores de JDK. Por lo tanto, antes de especificar una opción debe asegurarse de que sea compatible con la versión de JDK que se esté ejecutando en el sistema.
gotcha

Al determinar qué opción se utiliza, el nombre de la opción suele describir la acción que se produce si se habilita la opción. El valor predeterminado para la mayoría de opciones es dejar la característica inhabilitada. Por tanto, si inhabilita una opción que ya inhabilita una característica, es posible provocar una situación de doble negación. Esto es particularmente cierto con opciones que tengan nombres que empiecen con la palabra Disable (Inhabilitar). Por ejemplo, el valor predeterminado para la opción DisableExplicitGC hace que la JVM acepte las solicitudes de recogida de basura explícitas. Por tanto, normalmente querrá habilitar esta opción especificando un signo más delante de esta opción. El signo más tiene como efecto inhabilitar la aceptación de solicitudes de recogida de basura explícitas, que es lo que implica el nombre de las opciones. Con opciones como DisableExplicitGC, no es frecuente encontrar el valor -XX:-DisableExplicitGC porque este valor equivale a especificar la acción predeterminada.

En circunstancias en las que el nombre de la opción incluye el término Use (Utilizar), la opción suele tener más sentido para la habilitación o inhabilitación de esa característica y el sentido del signo más o menos suele ser más intuitivo.

Cuando se necesita especificar un valor, la opción aparece como una asignación con un signo igual entre la opción y el valor. En esta situación, la opción espera un valor de número adecuado que siga inmediatamente el signo igual, sin ningún espacio en blanco entre el signo igual y el número. A menudo el valor puede aceptar abreviaciones estándar, como k para kilobytes, m para megabytes y g para gigabytes, cuando es adecuado especificar estos valores. La máquina virtual sólo efectúa una validación limitada de estos parámetros y, si no son válidos, suele generar un mensaje de error que indica que la máquina virtual no puede iniciarse.

-Xmx (Tamaño máximo de almacenamiento dinámico de Java)

Ajuste este parámetro, junto con el parámetro -XX:MaxPermSize, para proporcionar suficiente memoria de almacenamiento dinámico Java. Cuando especifique un valor para el tamaño máximo de almacenamiento dinámico Java para almacenar objetos en el almacenamiento dinámico Java, debe considerar las exigencias de recursos máximos necesarios para procesar volúmenes grandes de entrada diseñados para que el sistema los gestione.

Por el contrario, el tamaño mínimo inicial del almacenamiento dinámico Java, especificado mediante el parámetro -Xms, debe reflejar el tamaño del almacenamiento dinámico Java necesario para acomodar los datos persistentes que se dan en el funcionamiento normal del sistema bajo una carga de entrada de estado estable. Esta solicitud de recurso asegura un arranque eficiente del sistema, donde sólo se reclama la cantidad justa de almacenamiento para permitir una rápida inicialización sin necesidad de muchos ciclos de recogida de basura para aumentar la capacidad de almacenamiento dinámico. Por tanto, la capacidad del tamaño de trabajo del almacenamiento dinámico Java varía entre la capacidad normal conocida para acomodar una carga de trabajo rutinaria de estado constante y el tamaño máximo diseñado para los sistemas; las variaciones en la capacidad de almacenamiento dinámico deben reflejar los cambios en las entradas de los sistemas, como una ráfaga de actividad o el aumento de carga de trabajo.

La capacidad del tamaño de trabajo del almacenamiento dinámico Java se considera una información útil sobre el estado de ejecución del sistema. El ajuste del tamaño mínimo inicial del almacenamiento dinámico Java sólo debe implicar la optimización del inicio del sistema. El establecimiento de los tamaños mínimo y máximo del almacenamiento dinámico en el mismo valor arregla el almacenamiento dinámico Java y limita las opciones de recuperación de la JVM para las tareas de reorganización del almacenamiento dinámico Java. Este tipo de configuración puede causar una reducción en el rendimiento y una pobre utilización de los recursos del almacenamiento dinámico Java.

-XX:+AggressiveHeap

Utilice este parámetro si emplea el recolector de basura de productividad/paralelo predeterminado con el ajuste incorporado habilitado. La JVM puede intentar ajustar agresivamente los parámetros de su algoritmo de ajusto mediante la utilización de todos los recursos del sistema operativo en el que se ejecuta. En situaciones en las que se ejecuta un solo proceso del producto con todos los recursos del sistema operativo, utilice esta opción para determinar si la JVM puede ofrecer resultados satisfactorios. La utilización de esta opción al probar los resultados de la JVM debe disminuir las tareas de ajuste.

-XX:CMSInitiatingOccupancyFraction=75

Configure este parámetro si utiliza el recolector de marca y barrido de pausa baja simultánea. Esta opción se utiliza para controlar CMS. Establece la condición de desencadenante para cuando la hebra de fondo dedicada empieza a efectuar la recogida de basura en la región de tenencia del almacenamiento dinámico. A diferencia de otras modalidades de recogida de basura, la acción de recogida de basura no espera que la asignación falle. Su objetivo es el de desencadenar la recogida de basura para recuperar espacio suficiente antes del inicio de la asignación que, en caso contrario, hubiera fallado. El desencadenante principal se basa en el porcentaje de utilización del almacenamiento dinámico Java y su valor predeterminado es de un 70%. El valor predeterminado suele garantizar que los ciclos CMS sean los suficientes, aunque esta frecuencia puede ser mayor si es necesario.

Sin embargo, con sólo una región eden muy pequeña y sin utilizar los espacios de supervivencia, casi no hay ninguna oportunidad para que los objetos envejezcan, de tal manera que el soporte de recogida de basura generacional puede recoger objetos de corta vida. Para sistemas que se aprovechan de la recogida de basura generacional, al producir muchos objetos de vida bastante corta, los valores predeterminados de CMS deniegan la oportunidad de explotar el soporte generacional para el que la estructura de Sun HotSpot está diseñada principalmente. Por sólo una pequeña inversión de recursos en los espacios de supervivencia de la generación joven y en una buena región eden para volver a habilitar la acción de recogida completa de basura generacional, probablemente sólo causará una pausa invasiva de un segundo o menos, manteniendo la promoción de objetos antiguos en la parte inferior de la región de tenencia. Esta condición tiene como ventaja la compactación libre del contenido superviviente a medida que los objetos envejecen y proporciona la mayor oportunidad para que la hebra CMS efectúe la recolección en la región de tenencia, incluso con grandes almacenamientos dinámicos.

-XX:+DisableExplicitGC

Esta opción inhabilita la recogida de basura explícita para eliminar los ciclos de recogida de basura innecesarios o inoportunos que podrían introducirse en los componentes de software del sistema.

Se recomienda que los desarrolladores eviten la utilización de llamadas System.gc() para generar ciclos de recogida de basura de compactación completa iniciados por el programador, porque estas llamadas pueden interferir con el ajuste de los recursos y la recogida de basura para un sistema de aplicaciones entero. Si se esfuerza para cumplir con los exigentes requisitos de tiempos de pausa y desea evitar las llamadas de recogida de basura iniciadas por el programador, debe considerar la utilización de esta opción ya que hace que se ignoren las llamadas System.gc() explícitas.

-XX:MaxNewSize= y -XX:NewSize=

Utilice estos parámetros si utiliza el recolector de basura de productividad/paralelo predeterminado, pero ha decidido ajustarlo manualmente en lugar de utilizar el ajuste incorporado que proporciona el parámetro -XX:+UseAdaptiveSizePolicy. El tamaño de generación joven actual va a ser mayor o igual que el tamaño de generación joven inicial o mínimo, como se especifica en el parámetro -XX:NewSize. Este tamaño es menor o igual que el valor especificado para el tamaño de generación joven máximo, como se especifica en el parámetro -XX:MaxNewSize.

Algunas circunstancias podrían indicar que se limita la cantidad de almacenamiento dinámico considerada por la recogida de basura generacional, como determina el parámetro -XX:NewRatio, limitando normalmente el ámbito máximo de la generación joven y, en ocasiones, limitando el tamaño mínimo. Por ejemplo, si establece el límite de un objeto grande que podría estar sujeto a la recogida de basura generacional o para limitar la cantidad máxima de memoria que se suele utilizar más allá del conjunto de objetos persistentes de larga duración, podría tener que establecer un tamaño máximo para el almacenamiento dinámico de la generación joven. Si especifica un tamaño mínimo, para la sección del almacenamiento dinámico que se utiliza para objetos de la generación joven, este suele acompañar el ajuste de la utilización de espacio de supervivencia, que normalmente es de importancia secundaria, pero debe cumplir con las limitaciones para los recursos mínimos en el almacenamiento dinámico Java, como se especifica en el parámetro -Xms.

A menos que persiga un comportamiento determinado dentro de la recogida de basura generacional, no debería ser necesario especificar un mínimo ni un máximo aparte de la utilización de la opción NewRatio. Los motivos para establecer los valores máximo o mínimo suelen ser diferentes. Estos valores raramente deben establecerse en el mismo valor, aunque hay una forma rápida de establecer y arreglar el tamaño de la sección de la generación joven mediante el parámetro -Xmn. No obstante, una configuración inadecuada puede suponer la pérdida total de las ventajas de la recogida de basura generacional.

-XX:MaxPermSize (región permanente)

Ajuste este parámetro junto con el parámetro -Xmx para proporcionar suficiente memoria de almacenamiento dinámico Java. La región permanente se emplea para almacenar todo el código de clase y datos parecidos a clases, como series internas.

La región permanente debe ser suficientemente grande para poder acomodar todas las clases que se puedan cargar simultáneamente. Determinar un tamaño adecuado para esta región puede ser complicado, ya que esta región del almacenamiento dinámico es menor, se expande más lentamente y se emplea concretamente para objetos parecidos a clases, además se ha observado que utiliza un 99-100% de su capacidad actual. Por tanto, debe interpretar con atención los sucesos de falta de memoria. Siempre debe verificar que esta región se expanda al máximo antes de proporcionar más recursos a esta región.

Avoid trouble Avoid trouble: En cualquier sistema basado en Java EE (Java Platform, Enterprise Edition), con su utilización profusa de cargadores de clases de aplicación, debe evitar la utilización del parámetro -Xnoclassgc porque previene la recogida de basura en esta región importante del almacenamiento dinámico, que efectivamente crea una pérdida de memoria de datos de clase. Para un sistema de desarrollo en el que con frecuencia se despliegue contenido cambiante de clases, debe asignar un tamaño significativamente mayor a esta región. También debe reiniciar regularmente este sistema para prevenir que versiones antiguas de código inactivo se acumulen junto a cargadores de clases utilizados actualmente, aunque no se pueden liberar.gotcha

-XX:MaxTenuringThreshold=número-de-recogidas

Configure este parámetro si utiliza el recolector de marca y barrido de pausa baja simultánea. Esta parámetro controla la promoción de los objetos de la sección de generación nueva a la sección de generación antigua al especificar el número de recogidas durante las cuales un objeto permanece en la sección de generación nueva antes de pasar a la sección de generación antigua. 8 es el valor predeterminado.

-XX:NewRatio=2

Utilice este parámetro si utiliza el recolector de basura de productividad/paralelo predeterminado, pero ha decidido ajustarlo manualmente en lugar de utilizar el ajuste incorporado que proporciona el parámetro -XX:+UseAdaptiveSizePolicy.

El almacenamiento dinámico Java se divide en dos secciones en las que se almacenan los objetos. En una de las secciones se produce la recogida de basura generacional y es donde residen los objetos de la generación joven. La otra sección, que consta del resto del almacenamiento dinámico, se denomina el almacenamiento dinámico de tenencia y es donde residen los objetos antiguos o de larga duración. Esta opción asigna un tamaño a la región de la generación joven que da soporte a la recogida de basura generacional, en proporción con la capacidad global del almacenamiento dinámico. El tamaño de generación joven actual va a ser mayor o igual que el tamaño de generación joven inicial o mínimo, como se especifica en el parámetro -XX:NewSize. Este tamaño es menor o igual que el valor especificado para el tamaño de generación joven máximo, como se especifica en el parámetro -XX:MaxNewSize. El tamaño de generación joven se mantiene como ratio en la región de tenencia, como determina la capacidad actual del almacenamiento dinámico Java principal. El valor predeterminado de 2 significa que la región de tenencia es el doble del tamaño de la región de la generación joven, es decir, que la generación joven es un tercio de la totalidad del almacenamiento dinámico Java.

Este valor predeterminado suele ofrecer un buen rendimiento en la recogida de basura generacional, que es el objetivo normal del ajuste de la JVM de Sun HotSpot. No obstante, existen otras estrategias. Por ejemplo, es posible que desee aumentar la proporción del almacenamiento dinámico en la que se da la recogida de basura generacional. Si decide cambiar la proporción, recuerde que hay un límite relativo a la cantidad de almacenamiento dinámico que la recogida de basura generacional puede mantener razonablemente; si se sobrepasa dicho limite, puede perderse toda la recogida de basura generacional porque los ciclos de recogida de basura pasarán a ser ciclos de recogida de basura importantes en relación a todo el almacenamiento dinámico en lugar de los ciclos de recogida de basura menores que sólo consideran la parte generacional del almacenamiento dinámico.

2 es el valor predeterminado para un servidor que se ejecute en modalidad VM.

-XX:NewSize=128m

Configure este parámetro si utiliza el recolector de marca y barrido de pausa baja simultánea. El tamaño de generación joven actual va a ser mayor o igual que el tamaño de generación joven inicial o mínimo, como se especifica en el parámetro -XX:NewSize. Una de las dificultades al efectuar el ajuste con CMS es que, en el peor de los casos, el tiempo dedicado a la recogida de basura puede llegar a ser de varios segundos, lo cual es especialmente costoso para un sistema que emplee CMS para evitar pausas de larga duración.

En consecuencia, los acuerdos de nivel de servicio podrían indicar la utilización de CMS. En esta situación, el ajuste debe pecar de precavido para asegurarse de que CMS tenga todas las oportunidades para ser satisfactorio. CMS sólo es satisfactorio si su desencadenante de anticipación asegura que el ciclo CMS se inicie con suficiente antelación para garantizar siempre que haya disponibles recursos libres suficientes antes de que se soliciten. Si el recolector CMS no puede finalizar antes de que se rellene la generación de tenencia, la colección se completa efectuando pausas en las hebras de la aplicación, que se denomina colección completa. Las colecciones completas son un signo de que es necesario ajustar más el recolector CMS para que la operación se ajuste mejor a la aplicación.

-XX:SurvivorRatio=

Utilice este parámetro si utiliza el recolector de basura de productividad/paralelo predeterminado, pero ha decidido ajustarlo manualmente en lugar de utilizar el ajuste incorporado que proporciona el parámetro -XX:+UseAdaptiveSizePolicy, o si intenta ajustar el recolector de pausa baja simultánea.

La acción de recogida de basura generacional tiene que ver con separar objetos de duración breve de otros de duración más larga. Sólo deben conservarse en el almacenamiento dinámico los objetos que se sigan utilizando. La región de la generación joven donde se da la recogida de basura generacional tiene una mayor estructura interna. Incluye una gran región eden en la que se asignan objetos inicialmente, así como espacios de supervivencia más pequeños en los que residen objetos de mayor duración. SurvivorRatio asigna tamaños a estas regiones en función del tamaño de la región eden en relación al espacio de supervivencia. La asignación de tamaños para los espacios de supervivencia suele ser de una importancia secundaria, ya que el volumen de los objetos que podría beneficiarse de la optimización varía mucho según la aplicación. Pero normalmente debe disminuir el valor predeterminado 25 hasta un valor de 8 aproximadamente.

Los cambios en este parámetro debe justificarse mediante un análisis de los datos relativos a la tenencia. Puede utilizar el parámetro -XX:+PrintTenuringDistribution para obtener estos datos.

Avoid trouble Avoid trouble: La opción -XX:SurvivorRatio= es incompatible con el parámetro JVM -XX:+UseAdaptiveSizePolicy. Utilice una de las dos opciones según la situación.gotcha

-XX:TargetSurvivorRatio=

Utilice este parámetro si utiliza el recolector de basura de productividad/paralelo predeterminado, pero ha decidido ajustarlo manualmente en lugar de utilizar el ajuste incorporado que proporciona el parámetro -XX:+UseAdaptiveSizePolicy.

Este parámetro hace que la JVM aumente la utilización porcentual de los espacios de supervivencia, evitando así una promoción prematura, si es posible, y maximizando la posibilidad de que se recojan los objetos de la generación joven. El valor predeterminado es 50. Se puede conseguir una mejor utilización de estas regiones si establece este parámetro en 90.

-XX:+UseAdaptiveSizePolicy

Utilice este parámetro para habilitar el ajuste incorporado con el recolector de basura de productividad/paralelo predeterminado.

Además de la detección automática de sistema operativo, Sun incluye un algoritmo de ajuste que intenta ajustar la JVM de manera autónoma para optimizar el objetivo de rendimiento y la eficiencia de la estrategia de recogida de productividad. De manera predeterminada, este algoritmo de ajuste está activado, pero se puede activar explícitamente con el parámetro -XX:+UseAdaptiveSizePolicy. Este algoritmo de ajuste normalmente debe obtener resultados satisfactorios para la mayoría de cargas de trabajo de aplicaciones, evitando tener que efectuar otras tareas de ajuste. No obstante, debe seguir probando este algoritmo para la carga de trabajo y verificar si cumple con los requisitos de productividad antes de utilizarlo en un entorno de producción.

-XX:+UseConcMarkSweepGC

Utilice este parámetro para habilitar el recolector de marca y barrido de pausa baja simultánea. Esta modalidad de recogida de basura reconfigura la recogida de basura generacional para que el sistema listo para utilizar minimice las pausas invasivas introducidas al tener que recopilar el contenido de la generación joven.

Este parámetro también minimiza la extensión de la generación joven o de la región eden. Los sistemas servidor-clase suelen detectar la disponibilidad de varios procesadores e intentan recopilar la generación joven en paralelo para tratar de producir la mínima pausa posible, aunque exista una cantidad limitada de trabajo disponible, ofreciendo pocas ventajas para la utilización de diversas hebras después de la carga de coordinación. Para contrarrestar que la recogida de basura generacional ya no lleva a cabo el trabajo, suele ser necesario aumentar los recursos dedicados al almacenamiento dinámico principal en un 10-30%, en comparación con los valores de productividad del recolector.

-XX:+UseParallelGC

Utilice este parámetro para habilitar el recolector de basura de productividad/paralelo predeterminado.

La modalidad de recogida de basura predeterminada de la JVM de un servidor es adoptar el recolector de productividad que lleva a cabo las pequeñas recogidas de basura en la generación joven en paralelo como tarea de parada total (stop-the-world) en primer plano. Este recolector se puede habilitar explícitamente mediante la utilización del parámetro -XX:+UseParallelGC. Se pueden especificar objetivos, aparte de la productividad. Sin embargo, la penalización en caso de no conseguir estos objetivos puede ser bastante grave y podría causar un error muy grave de falta de memoria.


Icon that indicates the type of topic Reference topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rprf_hotspot_parms
File name: rprf_hotspot_parms.html