sts jre jdk configurar change java jvm vmargs

java - jre - Modificar argumentos de JVM desde el interior de la JVM



sts ini jvm (7)

Específicamente, quiero poder cambiar el tamaño de almacenamiento dinámico máximo de la jvm desde adentro. es posible?

No.

¿Hay alguna manera de modificar los jvm args desde el interior de jvm? Específicamente, quiero poder cambiar el tamaño de almacenamiento dinámico máximo de la jvm desde adentro. es posible?

Editar : Supongo que debería agregar la razón por la que quería hacer esto. Tengo algunos programas Java que se ejecutan en diferentes máquinas / plataformas. Estos programas tienen configuraciones que se obtienen en tiempo de ejecución y son diferentes dependiendo de la máquina / entorno en el que se ejecute el programa. Algunas de estas configuraciones se pueden cambiar en tiempo de ejecución y los diversos programas se actualizan automáticamente a medida que cambian las configuraciones.

Quería que el tamaño del montón fuera uno de estos parámetros de configuración que se obtiene en tiempo de ejecución como el resto de la configuración. Si es así, entonces el programa podría iniciarse (con algunos jvm args predeterminados) y luego ajustarse en función de la configuración recuperada.


Este es un pensamiento de hackeo a medio camino serio, completamente fuera de lo normal:

... ¿y si generaste una nueva instancia de java (con la nueva configuración) del jvm actual y luego eliminaras el proceso anterior del nuevo? No tengo idea si esto ayudará o no (o incluso funcionará) ...


No puede cambiar esas opciones simplemente porque compromete la seguridad del sistema.

Si un administrador desea permitir que un determinado programa tenga ciertas capacidades estableciendo un administrador de seguridad, sería un problema grave si pudiera desactivarlo.

De todos modos, un programa no debería cambiar cosas como sus requisitos de memoria en tiempo de ejecución; el administrador debe conocerlos y configurarlos. No hay ninguna razón por la cual su programa deba hacer esto en tiempo de ejecución. Si realmente necesita cambiar esto, quizás la razón por la que pregunta es por qué el tipo de administrador no lo hace.


Con JRockit puedes al menos sugerir un tamaño de montón.

JVMFactory.getJVM().getMemorySystem().suggestHeapSize(100*1000*1000);

Ver JMAPI para más información


Como señalaron otros, esto generalmente solo es posible teniendo un programa de arranque (Java u otro lenguaje) que invoca la JVM principal con los parámetros correctos.

Dicho eso, ¿estás seguro de que esto es necesario? Usted menciona "tamaño máximo de almacenamiento dinámico". Si se refiere al parámetro -Xmx: este es solo un límite que la máquina virtual nunca puede exceder. No significa que la máquina virtual realmente usará tanto, lo hará con menos si puede.

Por lo tanto, siempre puede configurar -Xmx al máximo que el sistema puede manejar y dejar que la JVM decida cuánto necesita realmente. ¿Por qué crees que necesitas configurarlo dinámicamente?


La configuración dinámica -Xmx, por ejemplo, sería muy útil para controlar los recursos del sistema proyectados (principalmente huella) para tiempos de ejecución largos. Una de las muchas ramificaciones, por supuesto, es una sobrecarga de GC más grande / más larga.

Conozco varias máquinas servidor grandes que ejecutan docenas y docenas de JVM de 1G + heap. Si a estos tiempos de ejecución se les puede reducir la marca de agua durante los tiempos de poco uso, entonces podría administrar mejor los recursos de su sistema mucho mejor.


(Años después), encontré una biblioteca que logra lo que necesitaba en el momento en que publiqué. Akuma es una biblioteca para demonizar los procesos de Java. Permite reiniciar la JVM con nuevos argumentos.

La diferencia entre usar esto y lanzar un nuevo proceso con un programa de arranque es que stdin / stdout y otros descriptores de archivo se comparten automáticamente.