memoria maquina aumentar java memory jvm

java - maquina - ¿El tamaño máximo de pila JVM puede ser dinámico?



aumentar memoria java (3)

El argumento JVM -Xmx permite configurar el tamaño máximo de almacenamiento dinámico de la JVM en algún valor. Pero, ¿hay una manera de hacer que ese valor dinámico? En otras palabras, quiero decirle a la JVM "mira, si lo necesitas, solo sigue sacando RAM del sistema hasta que el sistema esté fuera".

Razón de dos partes para preguntar: primero, la aplicación en cuestión puede usar un rango muy amplio de ram, dependiendo de lo que esté haciendo el usuario, por lo que los valores mínimos y máximos conceptuales están bastante separados. En segundo lugar, parece que la JVM reserva el máximo espacio de almacenamiento dinámico de la memoria virtual en el momento del arranque. Esta aplicación en particular se ejecuta en una variedad bastante amplia de hardware, por lo que elegir un espacio de almacenamiento máximo "único para todos" es difícil ya que tiene que ser lo suficientemente bajo como para ejecutarse en hardware de gama baja, pero realmente Me gustaría poder aprovechar las máquinas realmente robustas si están disponibles.


Pero, ¿hay una manera de hacer que ese valor dinámico?

Literalmente, no. El tamaño máximo de almacenamiento dinámico se establece en el momento de inicio de JVM y no se puede aumentar.

En la práctica, puede establecer el tamaño máximo de almacenamiento dinámico en el tamaño que permita su plataforma y dejar que la JVM haga crecer el almacenamiento según sea necesario. Hay un riesgo obvio al hacer esto; es decir, que su aplicación utilizará toda la memoria y hará que la máquina del usuario se detenga. Pero ese riesgo está implícito en tu pregunta.

EDITAR

Vale la pena señalar que hay varias opciones de ajuste de -XX... GC que le permiten modificar la forma en que JVM expande el montón (hasta el máximo).

Otra posibilidad es dividir su aplicación en 2 partes. La primera parte de la aplicación hace toda la preparación necesaria para determinar el "tamaño" del problema. Luego, determina un tamaño de pila máximo adecuado e inicia la segunda parte de la aplicación con hambre de memoria en una nueva JVM.

  • Esto solo funciona si la aplicación se puede dividir de forma sensata como se indica anteriormente.

  • Esto solo funciona si es posible calcular el tamaño del problema. En algunos casos, calcular el tamaño del problema equivale a calcular el resultado.

  • No está claro si obtendrás un mejor rendimiento general que si solo permites que el montón crezca hasta un tamaño máximo.


Básicamente, no puedes adaptarte al hardware de varios usuarios utilizando Java puro: ahí es cuando un poco de script de shell / batch puede ser útil.

Hago exactamente eso en OS X y Linux: tengo un pequeño script de shell bash que se encarga de encontrar los parámetros JVM correctos en función del hardware en el que se ejecuta la aplicación y luego llama a JVM.

Tenga en cuenta que si está proporcionando una aplicación Java de escritorio, es posible que desee utilizar algo como izpack para proporcionar a sus usuarios un instalador:

http://izpack.org

No sé en absoluto si Java Web Start puede usarse para proporcionar diferentes parámetros de JVM dependiendo de la configuración del usuario (probablemente no, y JWS en realidad es un gran momento si planea proporcionar una aplicación de escritorio de aspecto profesional).


No lo hace Podría, y probablemente debería:

-Xmx90% // 90% of physical memory

Sin embargo, un valor implícito predeterminado, 100%, no es una buena idea.

Un programa escrito en un lenguaje que no sea GC maneja su memoria muy diligentemente, podará cualquier basura tan pronto como sea posible. Tiene sentido permitirle obtener cualquier memoria que solicite, asumiendo que es responsable de la eliminación rápida de basura.

Un lenguaje GC es diferente. Recolecta basura solo cuando sea necesario. Mientras haya espacio, no le importa que la basura permanezca por ahí. Si pudiera obtener toda la memoria que le gustaría tener, obtendría toda la memoria de la computadora.

Así que un programador de GC ya no tiene que preocuparse por desechar cada basura, pero debe tener una idea general de la proporción tolerable de basura / objeto vivo, e instruir a GC con -Xmx.