次のようなサブプロジェクトを作成するAntタスクを使用する <antcall>
と<ant>
、次のいずれかのエラーが原因で繰り返し呼び出されるとビルドが失敗する可能性があります。
- java.lang.OutOfMemoryError:PermGenスペース
- java.lang.OutOfMemoryError:Javaヒープスペース
このエラーは、呼び出されているタスクの1つがまたはを使用して定義されている場合にのみ発生し、。などのAntにバンドルされているタスクを使用している<typedef>
場合<taskdef>
は表示されません<javadoc>
。
OutOfMemoryError
Javaヒープの最大サイズを増やすことなく回避する方法はありますか?ヒープサイズを大きくするとしばらくは機能しますが、メモリを大量に消費するタスクを追加すると、問題が再発します。
次のタスク例と関連build.xml
ファイルにより
OutOfMemoryError
、LinuxボックスでJavaヒープが10 MBに設定されます(テスト用)。Antタスクは、メモリを大量に消費するオブジェクト(この場合はClosure Template Soy Module用のGuiceインジェクター)を作成します。このオブジェクトは、を使用して繰り返し呼び出され<antcall>
ます。
CreateGuiceInjectorTask.java
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.template.soy.SoyModule;
import org.apache.tools.ant.Task;
/** Custom Ant task that constructs a Guice injector. */
public final class CreateGuiceInjectorTask extends Task {
private Injector injector;
public CreateGuiceInjectorTask() {
injector = Guice.createInjector(new SoyModule());
}
public void execute() {
System.out.println("Constructed Guice injector...");
}
}
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="out-of-memory-test" basedir=".">
<property name="build.dir" location="${basedir}/build" />
<property name="CreateGuiceInjectorTask.jar"
location="${build.dir}/CreateGuiceInjectorTask.jar" />
<taskdef name="create-injector"
classname="CreateGuiceInjectorTask"
classpath="${CreateGuiceInjectorTask.jar}" />
<target name="call-create-injector">
<create-injector />
</target>
<target name="test"
description="Create multiple injectors until out of memory">
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
<antcall target="call-create-injector" />
</target>
</project>
テスト出力:
$ ant test
test:
call-create-injector:
[create-injector] Constructed Guice injector...
call-create-injector:
[create-injector] Constructed Guice injector...
...
call-create-injector:
BUILD FAILED
Could not create type create-injector due to java.lang.OutOfMemoryError: Java heap space