在Eclipse中运行ant时,javac出现java.lang.OutOfMemoryError错误

12

我在 ini 文件中为 Eclipse 分配了大量内存,但它仍然没有使用超过任务管理器中所显示的 300MB。

  [javac] The system is out of resources.
    [javac] Consult the following stack trace for details.
    [javac] java.lang.OutOfMemoryError: Java heap space
    [javac]     at com.sun.tools.javac.comp.Attr.selectSym(Attr.java:1938)
    [javac]     at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:1835)
    [javac]     at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1522)
    [javac]     at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
    [javac]     at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:377)
    [javac]     at com.sun.tools.javac.comp.Annotate.enterAttributeValue(Annotate.java:190)
    [javac]     at com.sun.tools.javac.comp.Annotate.enterAnnotation(Annotate.java:167)
    [javac]     at com.sun.tools.javac.comp.MemberEnter.enterAnnotations(MemberEnter.java:743)
    [javac]     at com.sun.tools.javac.comp.MemberEnter.access$300(MemberEnter.java:42)
    [javac]     at com.sun.tools.javac.comp.MemberEnter$5.enterAnnotation(MemberEnter.java:711)
    [javac]     at com.sun.tools.javac.comp.Annotate.flush(Annotate.java:95)
    [javac]     at com.sun.tools.javac.comp.Annotate.enterDone(Annotate.java:87)
    [javac]     at com.sun.tools.javac.comp.Enter.complete(Enter.java:485)
    [javac]     at com.sun.tools.javac.comp.Enter.main(Enter.java:442)
    [javac]     at com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:819)
    [javac]     at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:727)
    [javac]     at com.sun.tools.javac.main.Main.compile(Main.java:353)
    [javac]     at com.sun.tools.javac.main.Main.compile(Main.java:279)
    [javac]     at com.sun.tools.javac.main.Main.compile(Main.java:270)
    [javac]     at com.sun.tools.javac.Main.compile(Main.java:69)
    [javac]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [javac]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    [javac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    [javac]     at java.lang.reflect.Method.invoke(Method.java:597)
    [javac]     at org.apache.tools.ant.taskdefs.compilers.Javac13.execute(Javac13.java:56)
    [javac]     at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1065)
    [javac]     at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:882)
    [javac]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    [javac]     at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source)
    [javac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    [javac]     at java.lang.reflect.Method.invoke(Method.java:597)
    [javac]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)

这是我的ini文件。

--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize1024m
--vm
C:\Program Files\Java\jdk1.6.0_24\bin\javaw.exe -vmargs -Xms512m -Xmx1024m

我不知道为什么它不使用我给它的内存。我需要做些其他事情来改变堆大小吗?

谢谢


2
你应该考虑更改你的问题标题,因为内存不足的原因是ant而不是Eclipse。 - Thomas Lötzer
5个回答

18

不是Eclipse耗尽了内存,而是Ant。Ant是从Eclipse作为外部工具运行的,因此它不会继承您在Eclipse中使用的VM设置。您可以在外部工具运行配置中为其设置选项。转到运行->外部工具->外部工具配置...然后在“Ant Builds”下找到您的ant构建,您可以在JRE选项卡中设置vm参数。


我已经在外部工具中为ANT分配了大量内存。它不应该会出现内存不足的情况。我已将ANT_OPTS设置为1024和512。 - LinuxBill
2
当从Eclipse运行ant时,ANT_OPTS被忽略。请参见https://bugs.eclipse.org/bugs/show_bug.cgi?id=26491中的Eclipse错误。您需要使用已在eclipse.ini中使用的vm参数。 - Thomas Lötzer

4

只有当您更改以下内容时,您的eclipse.ini设置才会生效:

运行->外部工具->外部工具配置。进入您使用的配置,在JRE选项卡下选择

在工作区中使用相同的JRE



这对我有效。


再试了一遍,还是不行!这个有什么问题呢?它使用的是刚下载并安装的jdk1.6。ANT_OPTS和JAVA_OPTS已经在Windows变量中设置好了。 - LinuxBill
在同一标签页下尝试“使用单独的JRE”,然后在VM参数中输入“-Xms512m -Xmx1024m”,也许可以解决问题。 - Nirmal- thInk beYond

0

我在一周前遇到了同样的问题,解决方法是将fork属性设置为true,以使用具有自己堆大小设置的单独进程运行javac。 如果fork设置为false或未设置(默认值为false),则javac将在与Ant相同的进程中运行。以下是我当前build.xml文件的片段:

<javac fork="true"
       srcdir="${basedir}/src"
       .....
</javac>

将fork设置为true还将限制javac实现中的任何内存泄漏到其自己的子进程,而不影响父Ant进程。 我在这里阅读了有关此提示的信息


0

查看此主题,了解最佳的Eclipse JVM设置


当运行ant时,Eclipse的JVM设置被忽略了,这就是@William Fleming正在做的事情。 - Thomas Lötzer

0

在启动构建时,Eclipse将运行Ant bin/sh脚本,您可以正确设置-Xms512m-Xmx1024m选项。

  1. 进入您的Eclipse文件夹
  2. 进入plugins > org.apache.ant_<version> > bin
  3. 修改与操作系统相关的Ant文件

    • 对于Windows:将此行添加到ant.bat文件中export ANT_OPTS=-Xmx512m

    • 对于Unix/Mac OS X:您可以直接编辑ant文件末尾的ant_exec_command命令或设置$ANT_ARGS变量


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