在OS X中设置ANT_OPTS的正确方法是什么?

3

在OS X(Snow Leopard)编译现有项目时,遇到“错误:Java堆空间,java.lang.OutOfMemoryError: Java堆空间”。

我正在使用默认的Java 1.6 64位SDK和Ant默认安装程序(两者均作为操作系统的一部分提供)。

我在其他操作系统环境中也遇到过这个问题,并通常通过使用ANT_OPTS来增加分配的内存来解决,但这似乎无效。

我尝试设置ANT_OPTS如下:

在同一个shell中,我输入

export ANT_OPTS="-Xmx1024m' ant build

我还尝试在~/.bash_profile中设置该值(我源代码以确保被接受)。

最终,我通过增加Ant脚本中javac任务中的内存来解决了内存问题,但这并不理想(我更喜欢使用ANT_OPTS)。

在OS X中运行Ant时,增加堆内存的正确方式是什么?

更新:

看起来我错了,ANT_OPTS正在按预期工作。问题在于我正在fork javac任务(如bkail所描述)。

这引出了我的下一个问题。为什么JAVAC进程在OSX上总是耗尽内存,而相同的代码/ant脚本在Linux上却可以正常工作?OSX默认安装的Java有什么不同,需要分配额外的内存?


Mac是64位的,而Linux机器是32位的吗?这可能解释了Mac上更高的内存使用率。 - Dan Dyer
2个回答

2

如果javac memoryMaximumSize设置起作用了,那么你的javac必须是fork="true",这意味着javac JVM与Ant JVM是分开的,这也意味着ANT_OPTS对javac JVM没有影响。你需要手动传递-Xmx设置。类似这样:

<project>
  <script language="javascript"><![CDATA[
    importClass(java.lang.Runtime)
    project.setProperty("memoryMaximumSize", Runtime.getRuntime().maxMemory());
  ]]></script>
  <javac srcdir="." memoryMaximumSize="${memoryMaximumSize}" fork="true"/>
</project>

ant -verbose 确认了该设置正在传播到分叉的 javac:

[javac] Compilation arguments:
[javac] '-J-Xmx520290304'

1
为了回答这个更新的问题,JVM默认的最大堆大小取决于系统是否被归类为“客户端”或“服务器”。如果被归类为“服务器”,则默认的最大堆大小取决于系统上可用的内存。更多信息请参见此处:

http://java.sun.com/docs/hotspot/gc5.0/ergo5.html

java -version 命令应该显示正在使用的虚拟机:

java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接