4

QuickBuild サーバー (5.0.14) を使用しています。これは、ant を使用してビルド ステップを実行しています。

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()、Ant が使用する JVM 内で Clover が反射的に呼び出されていることがわかります。

そのため、Ant JVM により多くのヒープ スペースを割り当てようとしました。これを行うには、QuickBuild でビルド ステップを編集し、次の環境変数を指定します:-

ANT_OPTSに設定されています-Xmx1024m -Xms512m

これで問題は解決しませんでした。(私はこれらの数値を空中から取り出しました。最大サイズはいかなる方法でも計算されませんでした。)

私の質問は、Clover に追加のヒープ領域を割り当てて、メモリを使い果たすことなく実行できるようにするにはどうすればよいかということです。または、これらの設定が使用されていることを確認するにはどうすればよいですか?

4

3 に答える 3

2

すべてを正しく行ったようです。ANT_OPTSこの問題を解決する正しい方法です。同様の問題を解決するために、ほぼ同じアプローチを使用しました。64 ビット JVM を使用しましたか? スペースが実際に割り当てられていることがわかりましたか?

とにかく、良い指示があります:

ここに画像の説明を入力

また、JVM が正しく作成されていることを確認し、実際の原因を特定するために、VisualVM を使用することをお勧めします。

于 2014-01-06T12:23:43.473 に答える
1

ant のメモリ サイズを増やすには、次の 2 つの方法があります。

  1. 環境変数の ANT_OPTS プロパティの値を設定します。例えば:
    set ANT_OPTS=-Xms256m -Xmx1024m -XX:MaxPermSize=120m

  2. Ant Java ターゲットで maxmeory 属性を指定します。例えば:

<target name="MergingHugeJars">
    <echo message="jar ${InputJars} を ${OutputJar} にマージ"/>
    <java jvm="${JVM}" classname="com.krishna.test.MergeHugeJars" fork="true" failonerror="true" maxmemory="512m" >
        <arg line="${OutputJar} ${InputJars}"/>
    </java>
</ターゲット>

maxmemory="512m"3行目のセクションをいじることができます。

于 2014-01-10T12:30:53.797 に答える
1

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
于 2014-01-13T05:14:34.540 に答える