2010-03-03 16 views
6

EDITAR no quiero utilizar Java Web Start¿Manera correcta de (re) iniciar una aplicación Java con parámetros de máquina virtual dependientes del hardware?

Tengo una aplicación Java que me gustaría correr con diferentes parámetros de VM en función de la cantidad de memoria del sistema se puso en marcha tiene .

Por ejemplo, si la máquina tiene 1 GB de memoria o menos me gustaría pasar "-Xmx200m" y "-Xmx400m" si tiene 2 GB y "-Xmx800m" si tiene 8 GB (estos son solo ejemplos).

¿Hay una forma portátil de hacerlo?

He intentado tener una primera pequeña aplicación de Java (por lo tanto, portátil) que determina la cantidad de memoria disponible y luego lanza una nueva aplicación de Java, pero no creo que esto esté muy limpio.

A partir de secuencias de comandos shell Bash ahora que he escrito que invocan la aplicación Java con los parámetros correctos en función de la configuración pero sólo funciona en Linux en OS X.

Cuál es la forma correcta de resolver esto?

Sería paquete de paquete de aplicación;) ayuda?

+1

¿Podría ampliar el motivo de por qué no desea usar JNLP/WebStart antes de que lo reinventemos aquí? –

+1

@Joachim Sauer: JWS es un gran no-no. Especialmente si escribe software comercial que vende a usuarios de OS X: Java tiene una * muy * mala reputación en OS X y simplemente mencionar que está escrito en Java significa una pérdida significativa de ventas. Además de eso, las directrices oficiales de Apple con respecto al empaquetado de aplicaciones Java dicen que el paquete debe estar en * .dmg *. En otras palabras, JWS es un * enorme * no-no. Por qué no se dice que IntelliJ IDEA se envía con JWS es una buena pregunta que uno puede hacerse a sí mismo. Según mi experiencia, solo se envían "aplicaciones para mascotas" con JWS. Nombre una aplicación pendiente enviada con JWS? – LowLevelAbstraction

Respuesta

0

Para definir las distintas configuraciones de inicio, me gustaría ir con JNLP. xmx se puede especificar allí.

Desafortunadamente, esto todavía te deja la tarea de averiguar cuánta memoria tiene el sistema, para lo cual tu pequeña aplicación Java suena mejor.

0

En la misma línea que su solución existente, uso scripts para iniciar mis aplicaciones pero en lugar de Bash uso Python. Python se envía en la mayoría de las distribuciones de Linux, así como en OSX. La única dificultad es Windows, pero puede sugerir Python como un prerrequisito similar a instalar JVM.

+0

@basszero: +1 ... No sé quién te modificó (te modifiqué +1, así que volví a cero :) Sé que Python está oficialmente en OS X (lo uso por algunas cosas;) Para todos: la creación de scripts antes de iniciar una aplicación es * muy * común y la mayoría de los instaladores de Java hacen justamente eso (como izpack, etc.). – LowLevelAbstraction

+0

agregar partes móviles adicionales agrega complejidad innecesaria. – Pat

+0

hormiga no es una parte móvil adicional? – basszero

2

¿Estás seguro de que quieres hacer esto? En general, la aplicación Java necesita una cierta cantidad de memoria, no más, no menos.

Si tiene una máquina con poca memoria y especifica un número pequeño en -Xmx corre el riesgo de quedarse sin memoria.

Si tiene una máquina con mucha memoria y especifica un número grande, la aplicación no usará toda la memoria, sino solo la cantidad requerida por los objetos en uso.

Por lo tanto, en general, no pierde memoria al especificar números grandes en -Xmx.

(Las excepciones son las aplicaciones de servidor que tienen una gran cantidad de 'rendimiento' objeto y tienden a perder la memoria.)

+0

Sí, estoy seguro de que quiero hacer esto. Hay una razón, por qué, por ejemplo, Photoshop usará más memoria cuando está en una máquina que tiene 20 GB de RAM y el usuario espera que la aplicación use más memoria en el caso de Photoshop (y en mi caso). "En general" no es el caso "en Photoshop" ni en el caso que me incitó a hacer esta pregunta :) Hay * innumerables * tipos de aplicaciones donde el uso de más memoria en sistemas que tienen, bueno, más memoria, tiene sentido . El mío es uno de ellos. – LowLevelAbstraction

+2

El parámetro -Xmx no configura cuánta memoria debe usar su aplicación, pero cuánto puede usar. La cantidad que realmente usa depende de la lógica de su aplicación (cuántos objetos crea). El único efecto que hace que -Xmx dependa de la memoria disponible de las máquinas es obtener OutOfMemoryError en máquinas pequeñas, pero no hará que la aplicación use más memoria en máquinas grandes. – Wolfgang

+0

insistes en no conseguirlo. Para ser exhaustivo, configuré -Xms y -Xmx, pero gracias por su pedantería. El * todo * punto de establecer un -Xmx más pequeño en una máquina pequeña es no obtener un OOM. Oh, btw, en tiempo de ejecución mi aplicación se adapta a la cantidad de memoria disponible. Un concepto con el que obviamente no estás familiarizado. Y ** SÍ, REALMENTE QUIERO HACER ESTO **. ¿Qué no entiendes en ** PREGUNTA **? Si no puede responder, entonces use comentarios, no una respuesta. – LowLevelAbstraction

2

¿Cuál es su queja con su enfoque actual, exactamente? Es completamente portátil (a diferencia de varias soluciones de scripting ... ¿por qué es un script "más limpio" que bytecode 100% portátil?), Y se adaptará perfectamente si el hardware cambia después de la instalación (por lo que es mejor que capturar los detalles de hardware como parte de su script de instalación).

Si puede explicar los problemas reales, puede ser más fácil encontrar una solución a esos problemas específicos.

Aquí hay una alternativa que quizás prefiera: copiar lo que Photoshop, GIMP, etc. hacen y hacer que el "uso de los recursos" o el "rendimiento" forme parte de las preferencias de su aplicación.Tendrás que pedirles que reinicien tu aplicación cuando/si cambian esta configuración (para reiniciar tu aplicación usando el procedimiento de inicio modificado, ya que no puedes cambiar los límites de memoria para una aplicación en ejecución ... donde escribes las nuevas banderas depende del método de implementación), pero no es un desastre para un entorno que probablemente cambie exactamente una vez.

También podría verificar su hardware en la primera ejecución, y si su configuración predeterminada está muy lejos de su configuración, solicíteles que cambien la configuración.

2

Desde http://ant.apache.org:

  1. es un programa Java
  2. ha incorporado en la bifurcación/mecanismo de lanzamiento
  3. tiene conceptos básicos de scripting
  4. es integrable dentro de otro programa
  5. ha analizador de la línea de comandos y otras cosas básicas que se ocupan de problemas de entorno/configuración.

le sugiero que

  1. Crear un build.xml (o crear los objetivos/tareas mediante programación)
  2. y tienen el programa inicial sea hormiga de ejecutar el script build.xml
+0

+1 Usando Ant como parte del producto, qué tan creativo –

+0

¡Gracias! Para los elogios :-) – Pat

+0

+1, lo investigaré. Suena interesante. – LowLevelAbstraction

0

Para cualquier 'tarea de configuración' sugeriría usar izpack, realmente potente y libre. También puede echar un vistazo a eclipse, donde han implementado reiniciar una aplicación java.

0

El uso de una secuencia de comandos bash en lugar de JavaApplicationStub en el paquete de aplicaciones permite cambiar los parámetros. Sin embargo, esto rompe la funcionalidad handleOpenFile(): la señal de evento nunca llega al evento handleEndFile ApplicationEvent. Ver http://lists.apple.com/archives/java-dev/2010/Jun/msg00009.html

Cuestiones relacionadas