Android Studio谷歌JAR文件导致GC超时限制错误

217

我正在使用OS X上的Android Studio,遇到以下错误信息:

构建失败。

  • 出现了什么问题: 任务':app:preDexDebug'执行失败。 com.android.ide.common.internal.LoggedErrorException:运行命令失败: /Applications/Android Studio.app/sdk/build-tools/android-4.4W/dx --dex --output /Users/alex/AndroidStudioProjects/SilentSMS/app/build/intermediates/pre-dexed/debug/android-4.3_r2.1-f22bbff4d1017230e169a4844a9c2195f13060d2.jar /Users/alex/AndroidStudioProjects/SilentSMS/app/libs/android-4.3_r2.1.jar

    错误代码:3 输出:

  UNEXPECTED TOP-LEVEL ERROR:
  java.lang.OutOfMemoryError: GC overhead limit exceeded
      at com.android.dx.cf.code.RopperMachine.getSources(RopperMachine.java:665)
      at com.android.dx.cf.code.RopperMachine.run(RopperMachine.java:288)
      at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:612)
      at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:412)
      at com.android.dx.cf.code.Simulator.simulate(Simulator.java:94)
      at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:782)
      at com.android.dx.cf.code.Ropper.doit(Ropper.java:737)
      at com.android.dx.cf.code.Ropper.convert(Ropper.java:346)
      at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:282)
      at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:139)
      at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:94)
      at com.android.dx.command.dexer.Main.processClass(Main.java:682)
      at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
      at com.android.dx.command.dexer.Main.access$600(Main.java:78)
      at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
      at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
      at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
      at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
      at com.android.dx.command.dexer.Main.processOne(Main.java:596)
      at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
      at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
      at com.android.dx.command.dexer.Main.run(Main.java:230)
      at com.android.dx.command.dexer.Main.main(Main.java:199)
      at com.android.dx.command.Main.main(Main.java:103)

我正在使用这个库:

http://grepcode.com/snapshot/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/

我拉取了JAR文件并将其添加到我的项目中 - 我试图构建的项目是:

https://github.com/domi007/silentSMS/

我知道这是因为我的xms和xmx值太低了。我在以下位置增加了它们:

/Applications/Android Studio.app/bin/idea.vmoptions,现在它显示为:

-Xms256m
-Xmx1024m

然而,我仍然遇到了错误。这可能是由什么原因引起的?除了silentSMS应用程序是Eclipse项目并且我将代码移植到Android Studio之外,我没有做任何修改。就Android Studio发现错误而言 - 它没有,其他一切看起来都很好。

13个回答

551

我认为有一种单独的方法可以提高dexing操作的堆限制。将以下内容添加到build.gradle文件中的android闭包中:

dexOptions {
    javaMaxHeapSize "4g"
}

看看这是否有帮助。(灵感来自于Scott Barta的这个答案)


47
"4G"有些过头了,"2G"就可以了。 - Hugo Gresse
3
太棒了!这也解决了我的错误。我发现给它更多的内存,构建速度就越快。我从一分钟多降到了19秒。 - Simon
2
我仍然收到错误提示: java.lang.OutOfMemoryError: GC overhead limit exceeded [org.gradle.api.internal.project.ant.AntLoggingAdapter] at java.util.BitSet.clone - IgorGanapolsky
7
我已经添加了这个内容,但我仍然看到“OutOfMemoryError”。 - Chad Bingham
9
对我来说没有起作用,需要在gradle.properties中增加以下内容: org.gradle.jvmargs=-XX:MaxPermSize=1024m -Xms1024m -Xmx4096m -XX:ReservedCodeCacheSize=1024m - hmac
显示剩余11条评论

95

在我的情况下,增加堆大小看起来是这样的:

使用Android Studio 1.1.0

android {
    dexOptions {
        incremental true
        javaMaxHeapSize "2048M"
    }
}

将上述代码放入您的Build.gradle文件中。


4
在启用Multidexing后,我成功解决了“GC overhead limit exceeded”的问题。异常出现在“com.android.dx.command.dexer.Main.runMultiDex(Main.java:334)”处。 - Someone Somewhere
这不太好看,但是Android Studio的错误显示为UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: GC overhead limit exceeded。异常位置在at com.android.dx.util.FixedSizeList.<init>(FixedSizeList.java:38),堆栈顶部是com.android.dx.command.dexer.Main.runMultiDex(Main.java:334) at com.android.dx.command.dexer.Main.run(Main.java:244) at com.android.dx.command.dexer.Main.main(Main.java:215) at com.android.dx.command.Main.main(Main.java:106) - Someone Somewhere
1
但是当我添加了你建议的javaMaxHeapSize和incremental参数之后,Android Studio就能够构建多dex应用程序。 - Someone Somewhere
如果2GB不够用了,那我会尝试一下Commonware建议的4GB。 - Someone Somewhere
1
谢谢。请注意文档中关于“incremental”的说明:这有很多限制,可能无法正常工作。请小心使用。 - Ferran Maylinch
增量式未被标记为已弃用。 - MHogge

46

这个新问题是由最新版本的Android引起的。

前往项目根目录,打开gradle.properties文件,并添加以下选项:

org.gradle.daemon=true

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

org.gradle.parallel=true

org.gradle.configureondemand=true

然后在您的 build.gradle 文件中添加以下更改:

dexOptions {
        incremental = true
        preDexLibraries = false
        javaMaxHeapSize "4g" // 2g should be also OK
}

2
警告:android.dexOptions.incremental 属性已被弃用,对构建过程没有影响。 - tir38
这解决了我的问题。但它创建了一个名为java_pid1512.hprof的非常大的文件。我猜测你的Dfile选项正在创建它?它是必要的吗?你能展示如何删除转储到文件吗? - j2emanue
1
@j2emanue:这个文件是由于“HeapDumpOnOutOfMemoryError”选项创建的:https://docs.oracle.com/cd/E15289_01/doc.40/e15062/optionxx.htm#BABDJEJI - Mehlyfication
1
可能需要更新:incremental 已在2018年底被删除。 - cuasodayleo
在AS 3.4中,在gradle.properties文件中启用"org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8"解决了我的问题。 - Jamal S

10

安卓开发工具Android Studio 3.5.3

在“偏好设置/设置”中找到内存设置(Mac上的Cmd + Shift + A或点击帮助并开始输入“内存设置”),将IDE堆大小和/或守护程序堆大小增加到您满意的程度。 输入图像描述


4

我通过以下方式禁用了即时运行:

菜单 首选项构建即时运行 "启用即时运行以热交换代码"

我猜测是即时运行使得构建变慢并且创建了一个大的pidXXX.hprof文件,导致AndroidStudio gc超过限制。

(我的设备SDK版本是19.)


你是怎么发现是Instant Run创建了这么大的hprof文件的?我最近在我们的GitLab服务器上注意到了一个创建的文件,但我们没有启用即时运行。 - AdamMc331

1
将以下内容添加到 build.gradle 文件中。
dexOptions {
   javaMaxHeapSize "2g"
}

1

如果您不想更改buildGradle,4G有点过头了,您可以使用FILE -> Invalid caches / restart。

对我来说这很好用...


1
对我来说,这里的所有答案都没有起作用。我猜想让CPU极度运转会使电脑发热。在关闭了消耗大量CPU的程序(如Chrome)并冷却笔记本电脑后,问题消失了。
参考信息:我的CPU使用率为96%-97%,内存使用量超过2,000,000K,由一个与Gradle相关的java.exe进程引起。

你的解决方案如何与这里提出的具体问题相关? - kalabalik
我遇到了与上述相同的错误: java.lang.OutOfMemoryError: GC overhead limit exceeded 我提供的解决方案已经为我解决了这个错误。 - Noy Oliel

0
我正在使用 Android Studio 3.4唯一有效的方法是从我的 build.gradle 文件中删除以下行:
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

因为 Android Studio 3.4 使用 full mode 中的 R8,且不直接兼容 Proguard


2
我认为在必须发布混淆版本时,这并不是一个解决方案。我已经使用了 gradle-5.2.1Android Studio 3.4,即使在启用了 Proguard 的情况下,minifyEnabled true 也可以正常工作,而 gradle-5.1.1 则存在类似问题。 - Vikas Patidar
这正好是我们想要的相反情况。-1 - Zun
就像我所说的那样,这对我起作用了,错误已经消失了,最终我能够生成apk。其他任何答案都没有在我的项目中起作用。 - pableiros
将Gradle更新至5.2.1,在/project/android目录下运行以下命令:./gradlew wrapper --gradle-version=5.2.1 - Ashok Devatwal

0

在某个时刻,我的构建 Gradle 中添加了一个 apply plugin: 'com.android.application' 的重复副本。删除重复副本并确保所有的 apply 插件都在顶部,这样问题就得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接