java.lang.OutOfMemoryError: GC overhead limit exceeded
at com.android.dx.rop.code.PlainInsn.withNewRegisters(PlainInsn.java:152)
at com.android.dx.ssa.NormalSsaInsn.toRopInsn(NormalSsaInsn.java:126)
at com.android.dx.ssa.back.SsaToRop.convertInsns(SsaToRop.java:341)
at com.android.dx.ssa.back.SsaToRop.convertBasicBlock(SsaToRop.java:322)
at com.android.dx.ssa.back.SsaToRop.convertBasicBlocks(SsaToRop.java:259)
at com.android.dx.ssa.back.SsaToRop.convert(SsaToRop.java:123)
at com.android.dx.ssa.back.SsaToRop.convertToRopMethod(SsaToRop.java:69)
at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:101)
at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:72)
at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:297)
at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:137)
at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:93)
差不多就是这样的堆栈,类似的还有java.lang.OutOfMemoryError: Java heap space
问题都是一个jvm内存不够。
解决:
因为是mvn包的错,所以第一个想要的是配置环境变量 MAVEN_OPTS,设成 -Xms1024m -Xmx1024m
但这这个法子这里不好用。
因为错误出现在android-maven-plugin的dex这一步。
熟悉的同学可能想到了,dex其实又是执行了一个java -jar的方式,是不是MAVEN_OPTS这个变量没有使用呢?
首先,我们定位到dex文件所在位置。
windows平台: where dx
linux平台:which dx
D:>where dx
D:\Java\adt-bundle-windows-x86_64-20130219\sdk\build-tools\21.1.1\dx.bat
打开dx.bat后发现,果然没有使用MAVEN_OPTS,而是通过自己定义的一个
set defaultXmx=-Xmx1024M
随手改成 set defaultXmx=-Xmx1524,重跑了一次mvn还是不行~
再加上mvn clean package -X看一下,运行dex的时候,还是-Xmx1024
那必然是com.jayway.maven.plugins.android.generation2的android-maven-plugin这个插件其实不是直接调用dx.bat的。
于是乎在翻翻android-maven-plugind的说明文档,
在configuration下加上这么一段
<dex>
<jvmArguments>
<argument>-Xms512m</argument>
<argument>-Xmx1524m</argument>
</jvmArguments>
</dex>
如图
问题解决。