8

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

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

我用谷歌搜索并检查了堆栈。在找到各种链接(参见此处此处此堆栈问题此堆栈问题)后,我修改了我的 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

我尝试使用 完全关闭 GC Overhead Limit -XX:-UseGCOverheadLimit ,但所做的只是给我一个 Java Heap Space 错误而不是 GC Overhead Limit 错误。我已经问过我的同事这件事,但他们也没有想法。

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

系统信息:

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

还有什么我可以做的吗?另一个要搜索的关键字?还有什么地方可以看?

4

4 回答 4

4

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

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

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

set defaultXmx=-Xmx1024M

set defaultXmx=-Xmx4096M

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

于 2012-06-29T14:19:57.713 回答
2

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

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

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

于 2012-06-28T22:21:06.420 回答
0

我相信您正在寻找的是:

-XX:-UseGCOverheadLimit
于 2012-06-28T21:46:51.460 回答
0

注意错误的目录、无效的符号链接或丢失的文件。例如,如果您的 build.xml 依赖于指向不存在的文件夹的符号链接,则可能会触发“GC Overhead Limit Exceeded”错误,而实际上它与内存或垃圾收集无关问题。

于 2021-08-12T13:23:57.987 回答