2009-06-19 5 views
33

Ich starte eine Java JAR-Datei, die oft mehr als die standardmäßige 64MB Max-Heap-Größe erfordert. Eine Heapgröße von 256 MB ist für diese App jedoch ausreichend. Gibt es trotzdem (vielleicht im Manifest) anzugeben, dass beim Start des JARs immer eine maximale Heapgröße von 256MB verwendet wird? (Nähere Einzelheiten unten, wenn nötig.)Kann ich die Java-Max-Heap-Größe für die Ausführung aus einer JAR-Datei festlegen?


Dies ist ein Kommandozeilen-Anwendung, die ich in Java geschrieben habe, die einige Bildmanipulation der Fall ist. Bei hochauflösenden Bildern (etwa 12 Megapixel und mehr, was nicht ungewöhnlich ist) bekomme ich einen OutOfMemoryError.

Derzeit bin ich starten Sie die App aus einer JAR-Datei, dh

java -jar MyApp.jar params...

ich eine OutOfMemoryError durch Angabe 256MB max Heap-Größe auf der Kommandozeile vermeiden kann, das heißt:

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

Allerdings möchte ich dies nicht angeben müssen, da ich weiß, dass 256 MB auch für hochauflösende Bilder ausreichend ist. Ich möchte diese Informationen in der JAR-Datei gespeichert haben. Ist das möglich?

+1

Die kurze Antwort ist nein, Sie können keine JVM-Argumente für eine JAR angeben. Siehe verwandte Frage http://StackOverflow.com/Questions/193483 –

Antwort

12

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

+0

Ich mag dies, und es würde den "Java-JAR" Teil der Befehlszeile auch loswerden. – Kip

+0

eigentlich ist es nicht ganz so toll wie ich dachte. Ich habe keinen Mac, aber ich möchte einen Mac ausführbaren Wrapper für meine JAR-Datei von meinem Windows-Rechner erstellen. es sieht aus wie diese App nicht ganz das tun ... – Kip

+0

Ich benutze Jarbundler für meine Mac-Anwendungen – willcodejavaforfood

3

Gefunden an answer auf 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

Dies ist nicht großartig, aber Sie könnten es als ausführbare JAR haben, und dann in seiner Hauptfunktion, führen Sie es über die Befehlszeile als Nicht-Daemon-Thread mit den richtigen Parametern in einer Eigenschaftendatei gespeichert oder berechnet oder was auch immer, dann verlasse das Original. Sie könnten es sogar ausführen lassen, mit einem anderen "echten" Einstiegspunkt, der diese Parameter erwartet.

4

testete ich ein ähnliches Bedürfnis hatte, und dachte, ich sollte diese in der Lage sein, zu spezifizieren, in dem Manifest, wie oben vorgeschlagen. Dies ist jedoch nicht möglich. Meine Lösung ähnelt der oben von Alex vorgeschlagenen Lösung. Ich habe jedoch die Hauptmethode verwendet, mit der Java ProcessBuilder einen anderen Java-Prozess startet. Wenn Sie einen anderen Prozess starten, können Sie den maximalen Speicher für den neuen Prozess angeben. Sie haben im Wesentlichen einen Java-Prozess, um einen anderen zu starten. Es ist ein wenig hokey, aber es funktioniert und es erlaubt Ihnen immer noch, Ihre App zu starten, indem Sie auf die Jar-Datei doppelklicken, die ich weiß, dass Sie tun möchten. Schauen Sie in den ProcessBuilder.

+0

danke, das ist eine gute Idee. Ich werde es sehen müssen! – Kip

0

Es gibt viele Möglichkeiten, es zu tun:

Sie können durch eine andere Jar-Datei, die Ihre Haupt Jar auslöst.

Oder haben Sie eine Batch-Datei, die Ihr Glas starten wird.Aber seien Sie vorsichtig, wenn Sie von say net heruntergeladen haben, muss der Benutzer Berechtigungen für das Skript einrichten, um runnable

Erstellen Sie ein Installationsprogramm. Auf Mac, mit dem Oracle Java App-Bundler für Java 7, Apple App Bundler für Java 6 Build. APP-Datei. Sie können es immer noch nicht verteilen, da die erforderlichen Berechtigungen nicht festgelegt werden. Erstellen Sie ein DMG für die App-Datei. Dies kann für die Verteilung verwendet werden. Ein ähnliches Installationsprogramm für Windows

Die dritte Technik wäre die beste sein, da man dann auch die Abhängigkeiten verpacken kann so eingestellt, alle JVM-Argumente etc

1

Anscheinend auf Ubuntu funktioniert

> export _JAVA_OPTIONS="-Xmx1g" 

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

+0

Oder JAVA_TOOL_OPTIONS = "- Xmx1g" –

15

eine Batch schreiben oder sie ll Skript mit der folgenden Zeile. In den Ordner legen, in dem MyApp.jar gespeichert ist.

java -Xmx256M -jar MyApp.jar 

Danach immer diese Batch/Script-Datei öffnen, um die JAR-Datei zu starten. Obwohl dies die Spezifikation der Größe des virtuellen Speichers nicht in die JAR-Datei einbetten kann. Aber, es kann das Problem überschreiben, um den gleichen Befehl oft in der Befehlszeile zu schreiben.

+1

Eigentlich beantwortet es die Frage. Obwohl, vier Jahre zu spät. – brezanac

Verwandte Themen