2009-08-31 4 views
3

Я столкнулся с ошибкой: куча Java-кучи, java.lang.OutOfMemoryError: Java heap space 'при компиляции существующего проекта на OS X (Snow Leopard).Каков правильный способ установки ANT_OPTS в OS X?

Я использую 64-разрядный SDK по умолчанию для Java 1.6 по умолчанию и установку Ant (по умолчанию предоставляются как часть ОС).

Я столкнулся с этой проблемой в других средах ОС и обычно решает ее, используя ANT_OPTS для увеличения выделенной памяти, но это, похоже, не работает.

Я попытался установить ANT_OPTS следующим образом:

В той же оболочке я вошел

экспорт ANT_OPTS = "- муравей сборки Xmx1024m»

Я также попытался установить значение в ~/.bash_profile (который я получил, чтобы убедиться, что он был поднят).

В конечном итоге я решил проблему с памятью, увеличив память в задаче javac в моем скрипте Ant, но это не идеально (я бы скорее использовал ANT_OPTS).

Каков правильный способ увеличить объем памяти кучи при запуске Ant в OS X?

UPDATE:

Оказывается, я был неправ, и ANT_OPTS это подхватили, как освобожденный. Проблема в том, что я разворачиваю задачу javac (как описано в bkail ниже).

Это приводит меня к следующему вопросу. Почему в процессе JAVAC заканчивается нехватка памяти на OSX, когда тот же самый скрипт кода/муравей отлично работает в Linux? Чем отличается стандартная OSX-установка Java, которая означает, что для нее требуется выделенная дополнительная память?

+0

Является ли Mac 64-бит и машина Linux 32-бит? Это может привести к увеличению использования памяти на Mac. –

ответ

2

Если параметр javac memoryMaximumSize имеет какой-либо эффект, тогда ваш javac должен быть fork = "true", что означает, что Javac JVM отделен от JVM Ant, что означает, что ваш ANT_OPTS не будет влиять на JVM javac. Вам необходимо вручную развернуть параметр -Xmx. Что-то вроде этого:

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

муравей -verbose подтверждает настройки распространятся на раздвоенной JAVAC:

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

Чтобы ответить на обновленный вопрос, максимум по умолчанию кучи меняется в зависимости от классифицирует ли JVM системы как «клиент» или «сервер». Если он классифицируется как «сервер», то максимальная куча по умолчанию изменяется в зависимости от доступной памяти в системе. Смотрите здесь для получения дополнительной информации:

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

Java -версия должна показать, какую ВМ выбирает:

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)