Android Studio Google JAR 文件导致 GC 开销限制超出错误

Posted

技术标签:

【中文标题】Android Studio Google JAR 文件导致 GC 开销限制超出错误【英文标题】:Android Studio Google JAR file causing GC overhead limit exceeded error 【发布时间】:2014-09-20 17:26:02 【问题描述】:

我在 OS X 上使用 android Studio。我收到以下错误消息:

FAILURE:构建失败并出现异常。

出了什么问题: 任务 ':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 和 xmlx 值太低。我增加了它们:

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

-Xms256m
-Xmx1024m

但是,我仍然收到错误消息。这可能是什么原因造成的?除了silentSMS 应用程序是一个Eclipse 项目并且我将代码移植到Android Studio 之外,我没有进行任何更改。在 Android Studio 发现错误方面 - 它没有,其他一切看起来都很好。

【问题讨论】:

【参考方案1】:

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

dexOptions 
    javaMaxHeapSize "4g"

看看有没有帮助。

(想法由this answer from Scott Barta提供)

【讨论】:

4g 有点矫枉过正,2g 还可以 太棒了!这也解决了我的错误。我发现我给它的内存越多,构建的速度就越快。我从超过 1 分钟到 19 秒。 我仍然收到错误:java.lang.OutOfMemoryError: GC 开销限制超出 [org.gradle.api.internal.project.ant.AntLoggingAdapter] 在 java.util.BitSet.clone 我已经添加了这个,但我仍然看到OutOfMemoryError 对我不起作用,需要在 gradle.properties 中升级:org.gradle.jvmargs=-XX:MaxPermSize=1024m -Xms1024m -Xmx4096m -XX:ReservedCodeCacheSize=1024m【参考方案2】:

在我的例子中,增加 heap-size 看起来像这样:

使用 Android Studio 1.1.0

android 
    dexOptions 
        incremental true
        javaMaxHeapSize "2048M"
    

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

【讨论】:

这在我启用 Multidexing 后克服了GC overhead limit exceeded。例外是在at com.android.dx.command.dexer.Main.runMultiDex(Main.java:334) 这不会像评论一样漂亮,但 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) 但是,只要我添加了您建议的 javaMaxHeapSize 和增量参数,Android Studio 就能够构建多索引应用程序。 如果2gb不够用,那我试试commonware建议的4gb。 谢谢。请注意文档对incremental 的评价:这有很多限制,可能不起作用。小心使用。【参考方案3】:

这个新问题是由最新版本的 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

【讨论】:

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

Android Studio 3.5.3

在首选项/设置下找到内存设置(Mac 上的 Cmd + Shift + A 或单击帮助并开始输入“内存设置”),并增加 IDE 堆大小和/或守护进程堆大小以使您满意

【讨论】:

【参考方案5】:

我通过以下方式禁用我的 Instant Run:

Menu PreferenceBuildInstant Run "Enable Instant Run to hot swap code"

我猜是 Instant Run 使构建速度变慢并创建了一个大尺寸的 pidXXX.hprof 文件,导致超出了 AndroidStudio gc 开销限制。

(我的设备 SDK 是 19。)

【讨论】:

您是如何发现 Instant Run 创建了如此大的 hprof 文件的?我注意到最近在我们的 GitLab 服务器上创建了一个,但我们没有启用即时运行。【参考方案6】:

对我来说,我在这里看到的所有答案都不起作用。我猜想让 CPU 非常努力地工作会使计算机变热。在我关闭消耗大量 CPU 的程序(如 chrome)并冷却我的笔记本电脑后,问题就消失了。

供参考:java.exe 进程(实际上是 gradle 相关进程)的 CPU 使用率为 96%-97%,内存使用量超过 2,000,000K。

【讨论】:

你的解决方案与这里提出的具体问题有什么关系? 我得到了上面指定的相同错误:java.lang.OutOfMemoryError: GC 开销限制超出我提供的解决方案为我解决了这个错误【参考方案7】:

将此添加到 build.gradle 文件中

dexOptions 
   javaMaxHeapSize "2g"

【讨论】:

【参考方案8】:

4g 有点矫枉过正,如果不想更改 buildGradle 可以使用 FILE -> Invalid caches / restart。

这对我来说很好......

【讨论】:

【参考方案9】:

我从任务管理器强制关闭了所有 Java.exe,重新启动了 Android Studio,它对我有用

【讨论】:

【参考方案10】:

我使用的是Android Studio 3.4唯一对我有用的是从我的build.gradle 文件中删除以下行:

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

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

【讨论】:

我认为当你必须发布一个混淆的版本时,这不是一个解决方案。我已将 gradle-5.2.1Android Studio 3.4 一起使用,即使使用带有 pro-guard 配置的 minifyEnabled truegradle-5.1.1 也能正常工作 有类似的问题。 这与我们想要的完全相反。 -1 就像我说的那样,这对我有用,错误消失了,最后我能够生成 apk。我的项目中没有其他答案。 更新 gradle 到 5.2.1/project/android 中运行 cammand ./gradlew wrapper --gradle-version=5.2.1【参考方案11】:

就我而言,我编辑我的gradle.properties

注意:如果你启用minifyEnabled true

删除这一行:

android.enableR8=true

并在你的 build.gradleandroid 块中添加这行:

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

希望这对某人有所帮助:)

【讨论】:

【参考方案12】:

在某些时候,apply plugin: 'com.android.application' 的副本被添加到我的构建 gradle 中。删除重复的副本并确保我所有的应用插件都在顶部为我解决了这个问题。

【讨论】:

【参考方案13】:

我尝试了上面提到的所有解决方案,但我仍然面临这个问题。 最后我偶然发现了以下解决问题的方法。

(在 MacOS 上)转到首选项 -> 内存设置 -> 查找现有成绩恶魔 -> 停止所有这些。

【讨论】:

以上是关于Android Studio Google JAR 文件导致 GC 开销限制超出错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 Google Play 服务的 Android Studio

Android Studio 抱怨重复类

将 Android volley 导入 Android Studio

MapActivity android studio

怎样在android studio中打jar包

android studio jar在哪