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:
Установка значения свойства ANT_OPTS в среде var. Например:
set ANT_OPTS=-Xms256m -Xmx1024m -XX:MaxPermSize=120m
Указание атрибута maxmeory в целевом объекте ant Java. Например:
Java> Цель>
Вы можете возиться с maxmemory="512m"
раздел третьей линии.