Den*_*hev 28 java memory ant heap javac
我有编写的ant脚本:
<javac srcdir="${test.src.dir}" destdir="${test.dist.dir}">
...
<compilerarg value="-Xlint:unchecked" />
</javac>
Run Code Online (Sandbox Code Playgroud)
我需要增加编译器的堆内存,所以我将以下参数放入compileargs:
<compilerarg value="-Xlint:unchecked -Xms128m -Xmx512m" />
Run Code Online (Sandbox Code Playgroud)
但我在控制台中收到错误:
[javac] javac: invalid flag: -Xms128m
[javac] Usage: javac <options> <source files>
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如何增加使用的内存javac?
Mik*_*ark 54
默认情况下,<javac>使用Ant在进程中运行.Java的一般限制是,无法调整JVM进程,Xms并且Xmx一旦JVM进程启动.因此,您看到的错误消息是软件拒绝您违反此原则的尝试(使用无用的,不友好的错误消息.)
但是,如果你指定属性fork="true"上的<javac>标签,你将能够指定一个新的Xms和Xms.这是因为fork指示Ant启动要运行的新JVM子进程javac.因为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>
Run Code Online (Sandbox Code Playgroud)
(注意我使用的是compilerarg line=""而不是compilerarg value="".该line属性允许您指定多个以空格分隔的参数.该value属性用于传递单个参数.)
Ant将等待forked <javac>退出,这在javac进程完成其工作(即编译)之后发生.然后,Ant继续在其自己的原始JVM进程中运行构建脚本.Ant将检查分叉是否javac失败或成功,并根据此信息采取常规操作.
性能
不分叉通常更高效javac,而只是简单地调整整个初始Ant JVM的相关内存设置.这通常(但不总是)是最佳选择,因为启动单独的JVM通常比简单地允许javac在进程中运行更慢并且占用更多内存.
如果您使用的是蚂蚁提供ant.bat或ant.sh推出蚂蚁,一个简单的方法来调整Ant的Xms并且Xmx是定义环境变量ANT_OPTS来包含你需要的参数.有很多方法可以设置环境变量,但您可以编辑ant.bat:
set ANT_OPTS=-Xms128m -Xmx512m
Run Code Online (Sandbox Code Playgroud)
你有没有尝试过<jvmarg value="-Xmx512m" />Java任务?对于默认值,您可以使用ANT_OPTS环境变量.我发现这个例子,不是很有用,但有一个build.xml.
为了增加Javac堆空间,我在google搜索时发现了这一点.
<javac fork="true"
srcdir="${basedir}/src"
destdir="${basedir}/build/classes"
classpath="${project.classpath}"
memoryinitialsize="256m"
memorymaximumsize="256m">
</javac>
Run Code Online (Sandbox Code Playgroud)
它是从这个链接复制而来的.将fork设置为true很重要.