3 Stimmen

Wie setzt man ANT_OPTS in OS X richtig?

Ich erhalte die Meldung "Error: Java heap space, java.lang.OutOfMemoryError: Java heap space' beim Kompilieren eines bestehenden Projekts unter OS X (Snow Leopard).

Ich verwende das standardmäßige Java 1.6 64-Bit-SDK und die Standardinstallation von Ant (beide werden als Teil des Betriebssystems bereitgestellt).

Ich habe dieses Problem bereits in anderen Betriebssystemumgebungen festgestellt und löse es normalerweise, indem ich ANT_OPTS verwende, um den zugewiesenen Speicher zu erhöhen, aber das scheint nicht zu funktionieren.

Ich habe versucht, ANT_OPTS wie folgt einzustellen:

In der gleichen Shell habe ich Folgendes eingegeben

export ANT_OPTS="-Xmx1024m' ant build

Ich habe auch versucht, den Wert in ~/.bash_profile zu setzen (den ich ausgelagert habe, um sicherzustellen, dass er abgeholt wird).

Ich habe das Speicherproblem schließlich gelöst, indem ich den Speicher in der javac-Aufgabe in meinem Ant-Skript erhöht habe, aber das ist nicht ideal (ich würde viel lieber ANT_OPTS verwenden).

Wie kann ich den Heap-Speicher vergrößern, wenn ich Ant unter OS X ausführe?

UPDATE:

Es scheint, dass ich mich geirrt habe und dass ANT_OPTS als Ausnahmeregelung erkannt wird. Das Problem ist, dass ich die javac Aufgabe forken (wie von bkail unten beschrieben).

Das führt mich zu meiner nächsten Frage. Warum geht dem JAVAC-Prozess unter OSX ständig der Speicher aus, während derselbe Code/das gleiche Skript unter Linux problemlos funktioniert? Was ist an der Standard-OSX-Installation von Java anders, so dass zusätzlicher Speicher zugewiesen werden muss?

0 Stimmen

Ist der Mac 64-Bit und der Linux-Rechner 32-Bit? Das könnte der Grund für die höhere Speichernutzung auf dem Mac sein.

2voto

Brett Kail Punkte 33138

Wenn die javac memoryMaximumSize-Einstellung irgendeinen Effekt hat, dann muss Ihr javac fork="true" sein, was bedeutet, dass die javac JVM von der Ant JVM getrennt ist, was bedeutet, dass Ihre ANT_OPTS keinen Effekt auf die javac JVM haben. Sie müssen die Einstellung -Xmx manuell weitergeben. Etwa so:

<project>
  <script language="javascript"><![CDATA[
    importClass(java.lang.Runtime)
    project.setProperty("memoryMaximumSize", Runtime.getRuntime().maxMemory());
  ]]></script>
  <javac srcdir="." memoryMaximumSize="${memoryMaximumSize}" fork="true"/>
</project>

ant -verbose bestätigt, dass die Einstellung an das geforkete javac weitergegeben wird:

[javac] Compilation arguments:
[javac] '-J-Xmx520290304'

1voto

Brett Kail Punkte 33138

Um die aktualisierte Frage zu beantworten: Der standardmäßige maximale Heap hängt davon ab, ob die JVM das System als "Client" oder "Server" klassifiziert. Wenn das System als "Server" eingestuft wird, variiert der standardmäßige maximale Heap in Abhängigkeit vom verfügbaren Speicher des Systems. Weitere Informationen finden Sie hier:

http://java.sun.com/docs/hotspot/gc5.0/ergo5.html

java -version sollte anzeigen, welche VM ausgewählt ist:

java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X