还有什么我可以做的事情来处理运行Ant(命令行)的“GC Overhead Limit Exceeded”吗?

时间:2012-06-28 21:42:35

标签: java android ant

我正在尝试使用命令行Ant编译非常大型多项目Android项目。我最初使用Ant 1.8.3,但后来升级到1.8.4(结果是徒劳)。虽然我安装了Eclipse(Indigo,今天更新),但是这个项目的性质阻止了在Eclipse中使用Ant。

代码似乎生成得很好,但当它进入操作的“dex”阶段时,它会得到两个错误之一,具体取决于我的ANT_OPTS:“GC Overhead Limit Exceeded”或“Java堆”空间”。

我用Google搜索并检查了Stack。找到各种链接(c.f。hereherethis Stack questionthis stack question as well)后,我修改了我的Ant选项。 (许多链接涵盖了执行Java代码时发生的情况;我的问题实际上是在创建Android APK以供上传的Ant进程中。)

我的ANT_OPTS环境变量目前是:

-Xms4g -Xmx4g -Xmn256m -XX:PermSize=256m -XX:MaxPermSize=1024m -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=8

我尝试使用-XX:-UseGCOverheadLimit完全关闭GC Overhead Limit ,但所有这一切是给我一个Java堆空间错误而不是GC开销限制错误。我曾经问过我的同事,但他们也没有想法。

哦,还有一个“细节”:我可以使用Eclipse来编译和加载项目,这似乎工作“很好”;然而,这个“元项目”所需的大量项目表明我试图让Ant脚本运行。

系统信息:

  • 操作系统:Windows 7 64位
  • Java:Sun,1.6,64位
  • 物理内存:8Gb
  • Android:SDK工具:R20;平台工具:R12(今天更新,6月28日)

我还能做些什么吗?另一个要搜索的关键字?还有其他地方要看?

3 个答案:

答案 0 :(得分:4)

对此的部分答案。感谢当前的受访者,他们帮我跟踪了这​​一点。

显然,两个(可能是三个?)不同的地方需要更改Java VM opts,具体取决于错误发生的确切位置。在这种情况下,ANT_OPTS 会传递给Dex。

我能够通过编辑DX批处理文件来解决错误,更改:

set defaultXmx=-Xmx1024M

set defaultXmx=-Xmx4096M

明显然而:我永远不需要更改dx批处理文件。有人碰巧知道改变由Ant传递给Dex的Java选项的“正确”方法吗?

答案 1 :(得分:2)

这听起来就像应用程序缓慢耗尽堆空间时发生的情况。如果设置了GC开销限制,则JVM会很快死掉。如果你不这样做,应用程序会继续运行一段时间,花费越来越多的时间GC ......然后终于死了。

如果这是您的应用程序,则应检查存储泄漏。但由于它是一个众所周知且(可能是)经过良好测试的第三方应用程序,最简单的尝试是...增加堆大小。

要尝试的另一件事是关闭CMS。没有理由使用CMS进行批量编译:GC暂停无关紧要。只需使用吞吐量收集器。 (这可能无法解决堆大小问题,但它应该使您的构建运行得更快。)

答案 2 :(得分:0)

我相信你要找的是:

-XX:-UseGCOverheadLimit