OutOfMemoryError:GC开销限制超出了api 19

时间:2016-05-19 13:57:15

标签: java android garbage-collection

  

错误:未捕获的转换错误:java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:GC开销限制超出了api 19

现在怎么办?

仅当我尝试在API 19仿真器上运行它时才会出现此错误(如错误文本所示)。好吧,我明白我的应用程序刚刚变得很大......或者做到了吗?

我想我实际上并没有完全理解这个错误。 什么意思除了我需要增加堆大小?

接下来的问题是:增加它是不是很糟糕?我可以仅为API 19增加它并将其保留在其他地方,因为它可以完美地用于例如API 23?

如果我不想增加它,我该怎么办?我怎样才能找出这么大的特点?我一般可以做些什么来保持它的小?

所以这些都是很多问题,并且让他们好的版主不要告诉我只发布一个问题,这里是最后一个问题: 如果增加堆大小是不好的,我需要做些什么来避免出现此错误?

2 个答案:

答案 0 :(得分:0)

你在哪里遇到这个问题?

在编译期间或在运行应用程序期间?

如果是第一个,您需要确保在编译阶段您的堆很大。如果您使用的是Gradle,则可以在脚本中添加以下内容:

dexOptions {
   javaMaxHeapSize "2g"
}

如果是第二个 - 运行应用程序时出现错误,您可能需要重新设计应用程序,以便消耗更少的内存。您无法控制用户设备的JVM参数。

编辑:我不知道为什么两个API级别之间存在差异,但我认为这与从API级别21使用另一个运行时(ART)这一事实有关。在这里阅读更多相关信息:https://developer.android.com/studio/build/multidex.html 编译阶段可能因此而略有不同,导致API级别之间的内存需求不同。

答案 1 :(得分:0)

据我所知,没有办法增加真实手机上的堆大小,只能增加模拟器中的堆大小。我的经验是每个设备都有自己固定大小的堆使用的堆。我的一些应用程序没有运行在“较旧的”Android- / API版本上,我遇到了同样的问题。我使用的旧三星Galaxy S2只有64MB的堆,这是无法改变的。

对我来说,最终的解决方案是配置我的应用程序并进行大量重新设计,以某种方式减少我的应用程序的内存消耗。幸运的是谷歌已经写了一些关于这个主题的内容以及如何处理它。我建议你开始阅读Managing Your App's MemoryInvestigating Your RAM Usage。在那里,您将找到开始分析应用程序内存消耗的所有内容。