【问题标题】:javac: java.lang.OutOfMemoryError when running ant from Eclipsejavac:从 Eclipse 运行 ant 时出现 java.lang.OutOfMemoryError
【发布时间】:2011-04-07 09:44:01
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您应该考虑更改问题的标题,因为不是 Eclipse,而是 ant 内存不足

标签: java eclipse


【解决方案1】:

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

【讨论】:

  • 我从外部工具中给了 ANT 内存负载。它不应该耗尽内存。我已将其 ANT_OPTS 设置为 1024 和 512
  • 从 Eclipse 运行 ant 时会忽略 ANT_OPTS。请参阅 bugs.eclipse.org/bugs/show_bug.cgi?id=26491 处的 eclipse 错误您需要使用已在 eclipse.ini 中使用的 vm 参数
【解决方案2】:

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

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

配置。转到您使用的配置,在 jre 选项卡 -select 选项下

Run in same JRE in workspace



这对我有用 4 个

【讨论】:

  • 又试了一次,还是不行!使用新下载并安装的 jdk1.6 有什么问题。 ANT_OPTS 和 JAVA_OPTS 在 windows 变量中设置。
  • 在同一选项卡下尝试use separate jre 并在 vm arg put -Xms512m -Xmx1024m 下尝试工作
【解决方案3】:

使用最佳 Eclipse JVM 设置查看 this topic

【讨论】:

  • Eclipse JVM 设置在运行 ant 时被忽略,这就是 @William Fleming 正在做的事情
【解决方案4】:

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

  1. 转到您的 Eclipse 文件夹
  2. 转到plugins > org.apache.ant_<version> > bin
  3. 修改OS相关的Ant文件

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

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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2012-11-23
      • 1970-01-01
      • 2014-09-15
      • 2016-07-31
      • 1970-01-01
      相关资源
      最近更新 更多