2009-06-19 10 views
33

Sto lanciando un file jar java che spesso richiede più della dimensione massima dell'heap di 64 MB. Tuttavia, una dimensione heap di 256 MB è sufficiente per questa app. Esiste comunque la possibilità di specificare (nel file manifest forse?) Di utilizzare sempre una dimensione heap massima di 256 MB al momento del lancio del jar? (I dettagli più specifici di seguito, se necessario.)Posso impostare la dimensione massima dell'heap Java per l'esecuzione da un file jar?


Si tratta di un'applicazione a riga di comando che ho scritto in Java, che fa un po 'di manipolazione delle immagini. Sulle immagini ad alta risoluzione (circa 12 megapixel e oltre, che non è raro) ottengo un OutOfMemoryError.

Attualmente sto lanciando l'applicazione da un file jar, cioè

java -jar MyApp.jar params...

posso evitare un OutOfMemoryError specificando 256MB max dimensione heap sulla riga di comando, vale a dire:

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

Tuttavia, non voglio doverlo specificare, poiché so che 256 MB sono sufficienti anche per immagini ad alta risoluzione. Mi piacerebbe avere quelle informazioni salvate nel file jar. È possibile?

+1

La risposta breve è no, non è possibile specificare gli argomenti JVM per un JAR. Vedi la domanda correlata http://stackoverflow.com/questions/193483 –

risposta

12

potresti anche utilizzare un wrapper come launch4j che renderà un eseguibile per la maggior parte dei SO: es e ti permette di specificare le opzioni della VM.

+0

mi piace e si sbarazzerebbe anche della parte "java -jar" della riga di comando. – Kip

+0

in realtà, non è così bello come pensavo. Non ho un Mac, ma mi piacerebbe costruire un wrapper eseguibile mac per il mio file jar dalla mia macchina Windows. sembra che questa app non faccia proprio questo ... – Kip

+0

Io uso jarbundler per le mie app Mac – willcodejavaforfood

3

Trovato an answer su google.

Egli dice di no per il file JAR, sì in JavaWeb Start, e che dovresti farlo nello script/app (eventualmente specifico del sistema) di avvio/wrapper.

3

Questo non è eccezionale, ma si potrebbe avere come un JAR eseguibile, e poi nel suo principale, farlo eseguire tramite la riga di comando come un thread non daemon con i parametri appropriati memorizzati in un file di proprietà o calcolato o altro, quindi esci dall'originale. Potresti persino farlo eseguire il jar con un altro punto di ingresso "reale" che si aspetta quei parametri.

4

ho avuto una simile esigenza, e ho pensato che dovrebbe essere in grado di specificare questo nel manifesto come suggerito sopra. Tuttavia, questo non è possibile. La mia soluzione è simile a quella suggerita da Alex sopra, tuttavia, quello che ho fatto è stato che il metodo principale utilizza ProcessBuilder di Java per avviare un altro processo Java. Quando si avvia un altro processo, è possibile specificare la memoria massima per il nuovo processo. Essenzialmente stai facendo avviare un altro processo a un altro. È un po 'di hokey, ma funziona e consente comunque di avviare la tua app facendo doppio clic sul file Jar, che so che vuoi fare. Guarda in ProcessBuilder.

+0

grazie, è una buona idea. dovrò esaminarlo! – Kip

0

Ci sono molti modi per farlo:

È possibile per avere un altro file Jar Jar che innesca il vostro principale.

Oppure, disponi di un file batch che avvierà il tuo jar.Ma attenzione, se scaricato da rete, l'utente dovrà impostare le autorizzazioni per eseguire lo script

Creare un programma di installazione. Su Mac, utilizzando il pacchetto Oracle Java App per Java 7, Apple App Bundler per Java 6 crea il file .app. Non è ancora possibile ridistribuirlo poiché le autorizzazioni necessarie non verranno impostate. Crea un dmg per il file dell'app. Questo può essere usato per la distribuzione. Un programma di installazione simile per Windows

La terza tecnica sarebbe la migliore, come si può quindi pacchetto bene le dipendenze, impostare tutti gli argomenti JVM ecc

1

A quanto pare questo funziona su Ubuntu

> export _JAVA_OPTIONS="-Xmx1g" 

java -jar jconsole.jar & raccolse _JAVA_OPTIONS: -Xmx1g

+0

Oppure JAVA_TOOL_OPTIONS = "- Xmx1g" –

15

Scrivi un batch o lei ll script contenente la seguente riga. Inserisci nella cartella, dove è memorizzato MyApp.jar.

java -Xmx256M -jar MyApp.jar 

Successivamente, aprire sempre questo file batch/script per avviare il file JAR. Sebbene, questo non incorpori le specifiche della dimensione della memoria virtuale nel file jar stesso. Ma, può sovrascrivere il problema per scrivere lo stesso comando spesso sulla riga di comando.

+1

In realtà risponde alla domanda. Però, quattro anni troppo tardi. – brezanac

Problemi correlati