【问题标题】:OutOfMemoryError: GC overhead limit exceeded androidOutOfMemoryError: GC 开销限制超出了android
【发布时间】:2016-03-21 13:08:34
【问题描述】:

在 android studio 1.5.1 中,只需将源代码从一个系统移动到另一个系统,即使干净构建成功,但在运行代码时,我遇到了这种错误

java.lang.OutOfMemoryError: GC 开销限制超出错误: 执行 任务':app:dexDebug'失败。 > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException:进程'命令 '/usr/lib/jvm/java-7-openjdk-amd64/bin/java'' 以非零结尾 退出值 3

我还在 app.gradle 中添加了以下代码:

dexOptions {
        javaMaxHeapSize "4g"
}

【问题讨论】:

  • 你的 JVM 是 64 位的吗?如果是,则不能获得超过 1.7 GB 的堆。

标签: java android garbage-collection execute


【解决方案1】:

更新的 gradle 插件默认使用 R8 进程进行代码收缩。您可以通过在 gradle.proeprties 中添加以下行来尝试此操作。

org.gradle.daemon=true

org.gradle.configureondemand=true

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

【讨论】:

  • 这帮助我在升级到使用 Android 8 后通过 R8 未完成其进程。(堆错误;内存不足)以前的版本需要使用旧的 proguard/dexoptions。 R8 并不关心我通过之前的 dexOptions 值分配了多少内存。 dexOptions { javaMaxHeapSize "6g" // 方式过大,但在构建时会偶尔出现内存不足错误}
【解决方案2】:

详细信息"GC overhead limit exceeded" 表示垃圾收集器一直在运行,Java 程序进展缓慢。垃圾回收后,如果 Java 进程花费超过大约 98% 的时间进行垃圾回收,并且如果它回收的堆少于 2%,并且到目前为止一直在做最后 5 个(编译时间常数)连续垃圾集合,然后抛出 java.lang.OutOfMemoryError。通常会抛出此异常,因为实时数据量几乎无法放入 Java 堆中,几乎没有用于新分配的可用空间。 行动:增加堆大小。超过 GC Overhead limit 的 java.lang.OutOfMemoryError 异常可以通过命令行标志 -XX:-UseGCOverheadLimit 关闭。

本文摘自 Oracle Java 文档

【讨论】:

    【解决方案3】:

    GC overhead limit exceeded 表示您的应用程序占用了所有堆,垃圾收集器无法清理足够的空间来运行程序。

    因此,您的应用程序中存在太多必要的内存数据或内存泄漏(即可以从应用程序根目录访问但不再需要的引用) - 只有进一步的应用程序分析才能为您提供更多详细信息

    【讨论】:

      【解决方案4】:

      您可以通过添加来增加为应用分配的内存

      android:largeHeap="true"
      

      到您的清单文件,看看它是否解决了您的问题。 但是你应该在你的应用程序中寻找内存泄漏,因为 OutOfMemoryError 通常是内存管理不善的结果。

      【讨论】:

      • 我认为 OP 是在讨论运行编译的 Android Studio 的内存分配,而不是正在构建的应用程序。
      猜你喜欢
      • 2013-07-13
      • 1970-01-01
      • 2022-01-01
      • 2017-07-04
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 2017-04-20
      • 2013-06-11
      相关资源
      最近更新 更多