webentwicklung-frage-antwort-db.com.de

Kann ich die maximale Java-Heap-Größe für die Ausführung einer JAR-Datei festlegen?

Ich starte eine Java-JAR-Datei, die oft mehr als die standardmäßige maximale Heap-Größe von 64 MB erfordert. Für diese App ist jedoch eine Größe von 256 MB ausreichend. Gibt es trotzdem (im Manifest vielleicht?) Anzugeben, dass beim Starten des Jars immer eine maximale Heap-Größe von 256 MB verwendet werden soll? (Nähere Angaben dazu, falls erforderlich.)


Dies ist eine Befehlszeilen-App, die ich in Java geschrieben habe, die einige Bildmanipulationen vornimmt. Bei hochauflösenden Bildern (etwa 12 Megapixel und darüber, was nicht ungewöhnlich ist) bekomme ich einen OutOfMemoryError.

Derzeit starte ich die App aus einer JAR-Datei, d. H.

Java -jar MyApp.jar params...

Ich kann einen OutOfMemoryError vermeiden, indem ich in der Befehlszeile eine maximale Heap-Größe von 256 MB angeben, d. H .:

Java -Xmx256m -jar MyApp.jar params...

Ich möchte dies jedoch nicht spezifizieren, da ich weiß, dass 256 MB selbst für hochauflösende Bilder ausreichen. Ich möchte, dass diese Informationen in der JAR-Datei gespeichert werden. Ist das möglich?

35
Kip

sie könnten auch einen Wrapper wie launch4j verwenden, der für die meisten Betriebssysteme eine ausführbare Datei erstellt und die Angabe von VM - Optionen ermöglicht.

13

Schreiben Sie einen Stapel oder ein Shell-Skript, das die folgende Zeile enthält. Legen Sie in den Ordner, in dem MyApp.jar gespeichert ist.

Java -Xmx256M -jar MyApp.jar

Öffnen Sie danach immer diese Stapel-/Skriptdatei, um die JAR-Datei zu starten. Obwohl, wird die Angabe der Größe des virtuellen Speichers nicht in die JAR-Datei selbst eingebettet. Es kann jedoch das Problem außer Kraft setzen, den gleichen Befehl häufig in die Befehlszeile zu schreiben.

23
kravi

Ich hatte ein ähnliches Bedürfnis und dachte, ich sollte dies in der oben angegebenen Manifestation angeben können. Dies ist jedoch nicht möglich. Meine Lösung ähnelt der von Alex oben vorgeschlagenen Methode. Ich habe jedoch die Hauptmethode verwendet, um Javas ProcessBuilder zu verwenden, um einen anderen Java-Prozess zu starten. Beim Starten eines anderen Prozesses können Sie den maximalen Speicherplatz für den neuen Prozess angeben. Im Wesentlichen muss ein Java-Prozess einen anderen starten. Es ist ein bisschen hokey, aber es funktioniert und erlaubt es Ihnen immer noch, Ihre App zu starten, indem Sie auf die Jar-Datei doppelklicken, was Sie wissen möchten. Schauen Sie in den ProcessBuilder.

4
Andrew

eine Antwort gefunden bei Google.

Er sagt Nein für die JAR-Datei, Ja in JavaWeb Start und das sollten Sie in Ihrem (möglicherweise systemspezifischen) Launcher/Wrapper-Skript/App tun.

3
instanceof me

Das ist nicht so toll, aber Sie könnten es als ausführbare JAR-Datei haben und dann in der Hauptsache über die Befehlszeile als Nicht-Daemon-Thread ausführen, wobei die entsprechenden Parameter in einer Eigenschaftendatei gespeichert oder berechnet oder was auch immer sind und dann das Original verlassen. Sie könnten sogar das Glas mit einem anderen "echten" Einstiegspunkt ausführen lassen, der diese Parameter erwartet.

3
Alex Beardsley

JA! Sie müssen ein kleines Starterprogramm schreiben - dazu habe ich ein kleines, meist plattformübergreifendes, kompatibles Programm geschrieben. Dies wurde unter Windows/Ubuntu/Mac OS X getestet.

Silent Development Blogartikel zur Erhöhung des ausführbaren Java-Jar-Heap

2
Ben

Anscheinend funktioniert das auf Ubuntu

> export _Java_OPTIONS="-Xmx1g"

Java -Jar jconsole.jar & _Java_OPTIONS abgeholt: -Xmx1g

1
Syd Gillani

Es gibt viele Möglichkeiten, dies zu tun:

Sie können dies tun, indem Sie eine andere Jar-Datei haben, die Ihr Haupt-Jar auslöst.

Oder haben Sie eine Batch-Datei, die Ihr Glas startet. Aber seien Sie vorsichtig, wenn der Benutzer von say net heruntergeladen wird, muss der Benutzer Berechtigungen für das Skript festlegen, damit er ausgeführt werden kann

Installiere einen Installer Unter Mac OS erstellt der Apple App-Bundler für Java 6 mit dem Oracle Java App-Bundler für Java 7 die .app-Datei. Sie können es nicht weiter verteilen, da die erforderlichen Berechtigungen nicht festgelegt werden. Erstellen Sie eine DMG für die App-Datei. Dies kann zur Verteilung verwendet werden. Ein ähnliches Installationsprogramm für Windows

Die dritte Methode wäre die beste, da Sie dann die Abhängigkeiten gut packen, alle JVM-Argumente setzen können

0
Jatin