我正在尝试使用命令行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。here,here,this Stack question和this 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脚本运行。
系统信息:
我还能做些什么吗?另一个要搜索的关键字?还有其他地方要看?
答案 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