una seguridad por podido iniciar formada ejecucion desbloquear cómo configuracion con como certificado bloqueado bloqueadas bloqueada aplicación aplicaciones aplicacion airview java memory-management jar

seguridad - ¿Puedo establecer el tamaño máximo de almacenamiento dinámico de Java para ejecutar desde un archivo jar?



no se ha podido iniciar la aplicacion java (8)

Aparentemente esto funciona en Ubuntu

> export _JAVA_OPTIONS="-Xmx1g"

java -jar jconsole.jar y recogido _JAVA_OPTIONS: -Xmx1g

Estoy lanzando un archivo java jar que a menudo requiere más del tamaño predeterminado de almacenamiento dinámico de 64 MB. 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? (Más detalles específicos a continuación, si es necesario.)

Esta es una aplicación de línea de comandos que he escrito en Java, que hace algo 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 lanzando la aplicación desde un archivo jar, es decir,

java -jar MyApp.jar params...

Puedo evitar un OutOfMemoryError especificando un tamaño máximo de almacenamiento dinámico de 256MB en la línea de comando, 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?


Encontré una respuesta en google

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


Escriba un script por lotes o shell que contenga 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 batch / 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.


Esto no es genial, pero podría tenerlo como un JAR ejecutable, y luego en su main, hacer que se ejecute a sí mismo 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.


Hay muchas formas de hacerlo:

Puedes tener otro archivo Jar que active tu Jar principal.

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

Construye 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 similar para Windows

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


Tenía una necesidad similar, y pensé que debería poder 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.


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.