我有编写的ant脚本:
<javac srcdir="${test.src.dir}" destdir="${test.dist.dir}">
...
<compilerarg value="-Xlint:unchecked" />
</javac>
我需要增加编译器的堆内存,所以我将以下参数放入compileargs
:
<compilerarg value="-Xlint:unchecked -Xms128m -Xmx512m" />
但我在控制台中收到错误:
[javac] javac: invalid flag: -Xms128m
[javac] Usage: javac <options> <source files>
为什么会这样?如何增加javac
使用的内存?
答案 0 :(得分:50)
默认情况下,<javac>
在Ant中运行。 JVM进程启动后,您无法调整JVM进程“Xms
和Xmx
,这是Java的一般限制。因此,您看到的错误消息是软件拒绝您违反此原则的尝试(使用无用的,不友好的错误消息。)
但是,如果您在fork="true"
标记上指定了属性<javac>
,则 将能够指定新的Xms
和Xms
。这是因为fork
指示Ant启动运行javac
的新JVM子流程。由于JVM流程是新的,因此它为Ant提供了为其指定Xms
和Xmx
的可接受机会。
您可以尝试这样的事情:
<project name="project" default="all" basedir="[yourvalue]">
<target name="all">
<javac srcdir="[yourvalue]" destdir="[yourvalue]" fork="true">
<!-- javac requires that -Xmx and -Xms be prefixed with -J -->
<compilerarg line="-J-Xms128m -J-Xmx512m" />
</javac>
</target>
</project>
(注意我使用compilerarg line=""
而不是compilerarg value=""
。line
属性允许您指定多个以空格分隔的参数。value
属性用于传递单个参数。)
Ant将等待分叉<javac>
退出,这发生在javac
进程完成其工作(即编译)之后。然后,Ant继续在其自己的原始JVM进程中运行构建脚本。 Ant将检查分叉javac
是否失败或成功,并根据此信息采取常规操作。
<强>性能强>
而不是 fork javac
通常更有效,而只是简单地调整整个初始Ant JVM的相关内存设置。这通常(但不总是)是最佳选择,因为启动单独的JVM通常比简单地允许javac
在进程中运行更慢并且占用更多内存。
如果您使用Ant提供的ant.bat
或ant.sh
来启动Ant,则调整Ant的Xms
和Xmx
的简单方法是定义环境变量ANT_OPTS包含你想要的参数。有很多方法可以设置环境变量,但您只需编辑ant.bat
:
set ANT_OPTS=-Xms128m -Xmx512m
答案 1 :(得分:6)
您是否在Java任务下尝试过<jvmarg value="-Xmx512m" />
?对于默认值,您可以使用ANT_OPTS环境变量。我发现这个example,不是很有用,但有一个build.xml。
为了增加Javac堆空间,我在google搜索时发现了这一点。
<javac fork="true"
srcdir="${basedir}/src"
destdir="${basedir}/build/classes"
classpath="${project.classpath}"
memoryinitialsize="256m"
memorymaximumsize="256m">
</javac>
它是从link复制的。将fork设置为true很重要。
答案 2 :(得分:2)
我不认为这个问题与蚂蚁有关。如果您直接尝试javac -Xms128m -Xmx512m
,则会看到相同的消息。
您需要使用-J
选项将标志直接传递给运行时系统。 e.g。
-J-Xms128m -J-Xmx512m
而不只是-Xms128m -Xmx512m
中的compilerarg
。
javac -X
用于将非标准选项传递给编译器。如果您运行命令javac -X
,它将显示合法选项列表,其中包括您使用的-Xlint
。内存选项是底层JVM的设置,因此需要使用-J
。
<强>替代强>
memoryInitialSize
任务有-Xms
(相当于memoryMaximumSiz
)和-Xmx
e(相当于javac
)选项,请尝试使用这些选项而不是使用compilerargs
例如
<javac srcdir="${test.src.dir}" destdir="${test.dist.dir}"
memoryInitialSize="128m"
memoryMaximumSize="512m">