2009-06-19 15 views
33

Estoy iniciando un archivo java jar que a menudo requiere más del tamaño predeterminado de almacenamiento dinámico de 64MB. Sin embargo, un tamaño de almacenamiento de 256MB es suficiente para esta aplicación. ¿Hay alguna forma de especificar (quizás en el manifiesto) utilizar siempre un tamaño máximo de almacenamiento dinámico de 256 MB al iniciar el contenedor? (Los detalles más específicos a continuación, si es necesario.)¿Puedo establecer el tamaño máximo de almacenamiento dinámico de Java para ejecutar desde un archivo jar?


Esta es una aplicación de línea de comandos que he escrito en Java, lo que lo hace un poco de manipulación de imágenes. En imágenes de alta resolución (alrededor de 12 megapíxeles y más, lo que no es raro) obtengo un OutOfMemoryError.

Actualmente estoy de lanzar la aplicación desde un archivo JAR, es decir

java -jar MyApp.jar params...

puedo evitar un OutOfMemoryError especificando 256MB máximo tamaño de la pila en la línea de comandos, es decir:

java -Xmx256m -jar MyApp.jar params...

Sin embargo, no quiero tener que especificar esto, ya que sé que 256 MB es suficiente incluso para imágenes de alta resolución. Me gustaría tener esa información guardada en el archivo jar. ¿Es eso posible?

+1

La respuesta corta es no, no puede especificar argumentos JVM para un JAR. Ver la pregunta relacionada http://stackoverflow.com/questions/193483 –

Respuesta

12

También podría usar un contenedor como launch4j que hará un ejecutable para la mayoría de los sistemas operativos y le permitirá especificar las opciones de VM.

+0

me gusta esto, y también eliminaría la parte "java -jar" de la línea de comando. – Kip

+0

en realidad, no es tan bueno como pensaba. No tengo un mac, pero me gustaría construir un contenedor ejecutable mac para mi archivo jar desde mi máquina de Windows. parece que esta aplicación no acaba de hacer eso ... – Kip

+0

Yo uso jarbundler para mis aplicaciones mac – willcodejavaforfood

3

Encontrado an answer en google.

Dice que no para el archivo JAR, sí en JavaWeb Start, y que debe hacerlo en su secuencia de comandos/iniciador (posiblemente del sistema específico).

3

Esto no es genial, pero podría tenerlo como un JAR ejecutable, y luego en su main, ejecutarlo a través de la línea de comandos como un hilo no daemon con los parámetros adecuados almacenados en un archivo de propiedades o calculado o lo que sea, luego salga del original. Incluso podría hacer que ejecute el contenedor con otro punto de entrada "real" que espera esos parámetros.

4

que tenían una necesidad similar, y pensé que debería ser capaz de especificar esto en el manifiesto como se sugirió anteriormente. Sin embargo, esto no es posible. Mi solución es similar a lo que Alex sugirió anteriormente, sin embargo, lo que hice fue que el método principal utilizara ProcessBuilder de Java para iniciar otro proceso de Java. Al iniciar otro proceso, puede especificar la memoria máxima para el nuevo proceso. Básicamente, tienes un proceso Java que inicia otro. Es un poco aburrido, pero funciona y todavía te permite iniciar tu aplicación haciendo doble clic en el archivo Jar, que sé que quieres hacer. Mire en ProcessBuilder.

+0

gracias, esa es una buena idea. ¡Tendré que investigarlo! – Kip

0

Hay muchas maneras de hacerlo:

puedas tener otro archivo Jar Jar que desencadena su principal.

O, tenga un archivo por lotes que iniciará su jar.Pero tenga cuidado, si se descarga de say net, el usuario tendrá que establecer permisos para que la secuencia de comandos sea ejecutable

Cree un instalador. En Mac, con el paquete de la aplicación Oracle Java para Java 7, el paquete de aplicaciones de Apple para Java 6 crea el archivo .app. Aún no puedes redistribuirlo ya que no se establecerán los permisos necesarios. Crea un dmg para el archivo de la aplicación. Esto se puede usar para la distribución. Un instalador similares para Windows

La tercera técnica sería la mejor, ya que podemos empaquetar bien las dependencias, establezca todos los argumentos de JVM etc

1

Al parecer, esto funciona en Ubuntu

> export _JAVA_OPTIONS="-Xmx1g" 

java jconsole.jar-jar & Recogió _JAVA_OPTIONS: -Xmx1g

+0

O JAVA_TOOL_OPTIONS = "- Xmx1g" –

15

Escribir un lote o ella ll script que contiene la siguiente línea. Coloque en la carpeta donde se almacena MyApp.jar.

java -Xmx256M -jar MyApp.jar 

Después de eso, siempre abra este archivo de lote/script para iniciar el archivo JAR. Aunque, Esto no incluirá la especificación del tamaño de la memoria virtual en el archivo jar en sí. Pero, puede anular el problema para escribir el mismo comando a menudo en la línea de comandos.

+1

En realidad, responde la pregunta. Sin embargo, cuatro años demasiado tarde. – brezanac

Cuestiones relacionadas