OutOfMemoryError создает снимок клевера в Ant, запущенном из QuickBuild

У меня есть сервер QuickBuild (5.0.14). Это выполняется шаг сборки с использованием муравья.

Цель Ant выглядит следующим образом:

<target name="clover-snapshot" depends="with-clover">
  <clover-snapshot file="${clover.snapshot.file}"/>
</target>

Мы используем Clover версии 3.1.5.

Этот шаг не выполняется со следующей трассировкой стека:-

java.lang.OutOfMemoryError: Java heap space
    at com.cenqua.clover.util.CloverBitSet.read(CloverBitSet.java:71)
    at com.cenqua.clover.PerTestRecordingTranscript.read(PerTestRecordingTranscript.java:45)
    at com.cenqua.clover.RecordingTranscripts.readSliceFromDisk(RecordingTranscripts.java:124)
    at com.cenqua.clover.RecordingTranscripts$FileRef.read(RecordingTranscripts.java:354)
    at com.cenqua.clover.CoverageDataCollator.collatePerTestRecordings(CoverageDataCollator.java:156)
    at com.cenqua.clover.CoverageDataCollator.loadCoverageData(CoverageDataCollator.java:68)
    at com.cenqua.clover.CloverDatabase.loadCoverageData(CloverDatabase.java:164)
    at com.cenqua.clover.CloverDatabase.loadCoverageData(CloverDatabase.java:159)
    at com.cenqua.clover.CloverDatabase.loadWithCoverage(CloverDatabase.java:283)
    at com.cenqua.clover.tasks.CloverSnapshotTask.cloverExecute(CloverSnapshotTask.java:51)
    at com.cenqua.clover.tasks.AbstractCloverTask.execute(AbstractCloverTask.java:55)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:392)
    at org.apache.tools.ant.Target.performTasks(Target.java:413)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.Main.runBuild(Main.java:811)
    at org.apache.tools.ant.Main.startAnt(Main.java:217)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

Я беру это из звонка invoke() в вышесказанном Clover вызывается рефлексивно в JVM, используемой Ant.

Поэтому я попытался выделить больше пространства кучи для JVM Ant. Я сделал это, отредактировав шаг сборки в QuickBuild и указав следующую переменную среды:-

ANT_OPTS установлен в -Xmx1024m -Xms512m

Это не решило проблему. (Я вытащил эти цифры из воздуха, максимальный размер не был рассчитан каким-либо образом.)

Мой вопрос заключается в том, как я могу выделить дополнительное пространство кучи для Clover, чтобы он мог работать без нехватки памяти. Или, в качестве альтернативы, что я могу сделать, чтобы подтвердить, что эти настройки используются?

3 ответа

Похоже, вы все сделали правильно. ANT_OPTS это правильный способ решить эту проблему. Я использовал почти такой же подход для решения аналогичной проблемы. Вы использовали 64-битную JVM? Вы видели, что пространство фактически выделено?

Во всяком случае, есть хорошая инструкция:

введите описание изображения здесь

Я также предложил бы использовать VisualVM для проверки правильности создания JVM и определения фактической причины.

Вы можете использовать jstat, чтобы присоединиться к работающему процессу Java и посмотреть, используются ли ваши настройки:

$ jstat -gccapacity 19726
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC 
 42560.0 681984.0  42560.0 5312.0 5312.0  31936.0    85248.0  1363968.0    85248.0    85248.0  21248.0 169984.0  21248.0  21248.0      0     0

Xmx - это комбинация NGCMX и OGCMX. На английском языке максимальный размер кучи, который вы указываете через -Xmx, делится между старым и новым поколением.

Небольшой быстрый скрипт для удобного форматирования этой информации:

jcmd | grep -v JCmd | while read pid name; do echo -n "Xmx for $name "; jstat -gccapacity $pid | sed '1d' | awk '{ print $2 + $8 " MB" }'; done
Xmx for org.example.MyClass 2045952 MB

Существует два способа увеличить объем памяти для ant:

  1. Установка значения свойства ANT_OPTS в среде var. Например:
    set ANT_OPTS=-Xms256m -Xmx1024m -XX:MaxPermSize=120m

  2. Указание атрибута maxmeory в целевом объекте ant Java. Например:

 
    
     
        
     

Вы можете возиться с maxmemory="512m" раздел третьей линии.

Другие вопросы по тегам