【问题标题】:How to increase heap size on Android 2.3 (Gingerbread)?如何在 Android 2.3 (Gingerbread) 上增加堆大小?
【发布时间】:2015-01-04 07:41:56
【问题描述】:

当我尝试使用 StringBuilder.append() 创建大于 4MB 的 String 时,我收到了 OutOfMemoryError。

据我所知,StringBuilder 对大小没有任何限制,String 也没有。

所以我搜索了“如何增加 Android 堆大小”,据我从 this answerthis answer 得出的结论,Gingerbread 是唯一一个您无法处理堆大小的版本,因为对于较早的版本,您使用 VMRuntime 类,对于较新的版本 android:largeHeap="true" 在 Manifest 上。

这个假设正确吗?当你在 VMRuntime 和 android:largeHeap="true" 之间时你会做什么?

我使用Runtime.getRuntime().totalMemory()/1048576 - Runtime.getRuntime().maxMemory()/1048576 在我用于测试的设备(Android 2.3.6)上获得“分配了 42.00 MB 的 5.00 MB”。

【问题讨论】:

  • 我称之为 X Y 问题:您不应该寻找增加内存的方法。您应该寻找一种方法来解决您在内存中构建 4MB 字符串的问题。
  • @zapl 有时在处理遗留系统时你别无选择。

标签: android out-of-memory heap-memory android-2.3-gingerbread


【解决方案1】:

这个假设正确吗?

我不能说VMRuntime 是否有效。 android:largeHeap 绝对是 API 级别 11+ 的东西。

当你在 VMRuntime 和 android:largeHeap="true" 之间时你会做什么?

找到一种更节省内存的方法来构建您的 4MB String,例如为您的 StringBuilder 构造函数提供大容量。

或者,找到一种方法来实现您正在执行的任何操作,而无需创建连续的 4MB String

【讨论】:

  • 有趣,@CommonsWare 马克!因此,当您在 Gingerbread 中时,您不会使用堆,但在某些情况下它确实会增长。我使用StringBuilderensureCapacity(8388608) 来确保它会分配8MB 给它。果然,我收到了一条“dalvikvm-heap | Grow heap (frag case) to 33.268MB for 8388624-byte allocation”消息......并且错误消失了。正在使用一个连续的大随机 char String,因此创建具有最大文件大小的文件所需的写入操作更少。您是否建议任何其他更明智的方法?
  • @NickFanelli:“正在使用连续的大随机字符字符串,因此创建具有最大文件大小的文件所需的写入操作更少” - 特别是因为 Dalvik 没有压缩垃圾收集器,你并没有把你的堆碎片化这么多。 “你有什么其他更明智的方法吗?” - 除了首先(不知何故)避免真正大的String之外,没有..
猜你喜欢
  • 2014-10-15
  • 1970-01-01
  • 2011-05-06
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2013-06-17
相关资源
最近更新 更多