从Eclipse运行ant时的javac:java.lang.OutOfMemoryError

时间:2011-04-07 09:44:02

标签: java eclipse

我已经在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

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

由于

5 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:4)

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

  

运行 - >外部工具 - >外部工具

配置。转到你使用的配置,在jre tab -select选项

  

Run in same JRE in workspace


这对我有用了

答案 2 :(得分:0)

请参阅this topic最佳Eclipse JVM设置

答案 3 :(得分:0)

您可以正确地将-Xms512m -Xmx1024m选项设置为启动构建后Eclipse将运行的Ant bin / sh脚本。

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

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

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

答案 4 :(得分:0)

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

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

将fork设置为true还会将javac实现中的任何内存泄漏限制为其自己的子进程,而不会影响父Ant进程。 我读到了这个提示here