2009-04-18 16 views

Respuesta

57

Lo que puede hacer con una aplicación que tiene unos requisitos muy variables montón es configurar el máximo tamaño de la pila muy alta con -Xmx y sintonizar -XX:MaxHeapFreeRatio y -XX:MinHeapFreeRatio de modo que la aplicación no se aferran a una gran cantidad de memoria cuando el montón se reduce (lo hace con la configuración predeterminada).

Pero tenga en cuenta que esto puede ocasionar problemas de rendimiento cuando la memoria realmente utilizada por la aplicación varía de manera rápida y potente; en ese caso es mejor que se quede con toda la memoria en lugar de devolverla al sistema operativo solo para reclamarlo nuevamente un segundo después. También es posible que desee juguetear con el GC options para asegurarse de que el GC no deje demasiados objetos no reclamados por ahí, lo que suele ocurrir cuando hay mucho espacio para que el montón crezca, y que podría frustrar el objetivo de querer el tamaño del montón para ajustarse a las necesidades de la aplicación.

0

java -Xmx500m Sólo al arranque

11

Según http://www.dreamincode.net/forums/showtopic96263.htm, no se puede hacer esto en tiempo de ejecución, pero se puede generar otro proceso con un tamaño de la pila diferente.

+0

También conocido como un dolor monumental en la parte trasera. Si está utilizando mucha memoria, lo último que desea es liberarlo todo, luego volver a cargarlo en otro proceso. Por supuesto, no puede mantener el proceso anterior abierto el tiempo suficiente para transferir datos ya que está acaparando más memoria con 2 procesos solo para hacer la transferencia. Mejor espero que hayas adivinado bien este tiempo o lo vuelvas a hacer todo de nuevo. – Basic

8

Puede modificar esas configuraciones cuando inicia su aplicación, pero una vez que la JVM está funcionando, esos valores no pueden modificarse. Algo como esto:

java -Xms32m -Xmx512m FooBar

establecerá el tamaño del montón mínimo 32 MB y el tamaño máximo del montón a 512 MB. Una vez que se establecen, no puede cambiarlos dentro del programa en ejecución.

-1

Si entiendo su pregunta correctamente, está intentando cambiar el tamaño del almacenamiento dinámico en runtime. No veo ninguna razón por la que esto debería ser posible. Establezca el tamaño del almacenamiento dinámico en de inicio utilizando la opción JVM -Xmx. También le aconsejo que configure la opción -Xms solo si es absolutamente necesario. Esta opción establece la cantidad inicial de memoria principal que se asigna para la JVM.

Debe saber cómo se comporta su aplicación en términos de memoria. Establezca el valor de -Xmx sabiamente. Si su aplicación es una especie de aplicación de servidor, puede establecer un valor superior, de lo contrario, puede poner en peligro su elección con otras aplicaciones posibles que se ejecutan en máquinas cliente y, por supuesto, con la memoria disponible.

+1

Establezca el valor sabiamente ... Sí, este es un buen consejo. Pero considere este caso: está observando cómo hace que la aplicación se acerque al máximo del montón, y no puede hacer nada con eso. Sí, hay una fuga en el código ... pero primero debemos mantenernos vivos durante el día y luego solucionaremos el problema –

+0

Tenga en cuenta también que puede tratarse de un applet u otro tipo de aplicación donde no se controla el inicio de la máquina virtual configuraciones. Esos son casos donde esto sería bueno. El problema principal, creo, es que si pudieras cambiar esto, podrías tener problemas de memoria relacionados con la seguridad. –

2

El consenso puede ser que esto no sea posible, pero deberíamos ver la fuente JVM para ver cómo se puede controlar ergonómicamente. Sería muy agradable poder tener un agente JVMTI capaz de ajustar el tamaño de heap/perm/tenured/new/& c en línea/en tiempo de ejecución.

¿Qué es esto? Permitiría a los agentes inferir ajustes de tamaño basados ​​en los objetivos de rendimiento o huella, que serán importantes al mover las JVM a la nube.

+3

Esto parece una solicitud de función JVM en lugar de una respuesta. . . – ruakh

0

Me hice la misma pregunta a mí mismo. Y a diferencia de las respuestas anteriores, hay algo que puedo hacer sobre mi aplicación que aumenta el tamaño máximo de JVM del montón. Si la aplicación es un servidor web en modo de clúster, podría iniciar una nueva instancia con el tamaño de almacenamiento mínimo/máximo modificado y la instancia inicial de apagado.Eso será especialmente simple en GlassFish donde tiene una instancia de administración separada de nodeAgent (instancia agrupada del servidor de aplicaciones) JVM.

Dado que muchas aplicaciones de JVM son aplicaciones web, creo que vale la pena conservarlas en este blog.

2

Puede utilizar la opción -mx en el arranque (también conocido como -Xmx) Este es el tamaño máximo que nunca debería ser necesario en el cual causa que no es necesario establecerlo a más que el tamaño máximo que alguna vez lo necesitará.

Sin embargo, un problema es tener el principal() comprobar el tamaño máximo y reiniciar el Java si el tamaño máximo no es el deseado. es decir, comienza otro programa java y muere.

+0

Esto supone que sabes de antemano cuánta memoria necesitarás. Eso está bien para los servidores web/otras cosas que se transmiten, pero si está analizando datos (por ejemplo, construyendo un índice/buscando tendencias) necesita saber de antemano cuáles serán sus datos, lo cual es bastante limitante – Basic

+0

@Basic Usted no necesita saber cuánta memoria necesitará. El -Xmx es el máximo que puede tener JVM, es decir, el programa debería bloquearse con un OutOfMemoryError en lugar de utilizar más memoria. Este máximo generalmente se basa en la cantidad de memoria que tiene y el valor predeterminado es 1/4 de la memoria principal. La JVM no usará mucha memoria para un programa "hello world" independientemente de lo que establezca el máximo. –

+1

Supongamos que tiene un proceso y le da 50 gigas de memoria de antemano y, durante el aviso de ejecución, se está procesando una gran cantidad de GC, y probablemente 56 GiB sería mejor y no se puede reiniciar fácilmente el programa sin hacer muchos cálculos. – kap

Cuestiones relacionadas