我有一个QuickBuild服务器(5.0.14)。这是使用ant运行构建步骤。
Ant目标如下所示:
<target name="clover-snapshot" depends="with-clover">
<clover-snapshot file="${clover.snapshot.file}"/>
</target>我们使用的是三叶草版本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()的调用中可以看出,在Ant使用的JVM中反射地调用了三叶草。
因此,我尝试为Ant分配更多的堆空间。为此,我在QuickBuild中编辑了构建步骤,并指定了以下环境变量:
ANT_OPTS设置为-Xmx1024m -Xms512m
这并没有解决问题。(我从空气中提取了这些数字,没有以任何方式计算最大大小。)
我的问题是,我如何为Clover分配额外的堆空间,以允许它在不耗尽内存的情况下执行。或者,我可以做些什么来确认正在使用这些设置?
发布于 2014-01-06 20:23:43
看起来你做的一切都是对的。ANT_OPTS是解决这一问题的正确方法。我已经使用了几乎相同的方法来解决类似的问题。您使用的是64位JVM吗?您看到空间实际上已经分配了吗?
无论如何,有一个很好的instruction

我还建议使用VisualVM来验证是否正确创建了JVM,并找出实际原因。
发布于 2014-01-13 13:14:35
您可以使用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 0Xmx是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 MBhttps://stackoverflow.com/questions/20876669
复制相似问题