如何在 Android 2.3 (Gingerbread) 上增加堆大小?

Posted

技术标签:

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

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

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

所以我搜索了“如何增加 android 堆大小”,据我从 this answer 和 this 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 有时在处理遗留系统时你别无选择。 【参考方案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之外,没有..

以上是关于如何在 Android 2.3 (Gingerbread) 上增加堆大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 2.3 及更高版本中获取当前启动器的包名?

Android chromecast 在 2.3 上崩溃

如何为 android api 8 (Froyo) 添加 PBKDF2WithHmacSHA1

从0系统学Android-2.3使用 Intent 在 Activity 之间穿梭

Android Studio 2.3 sdk 管理器未打开

Android 版本 > 2.3 上的 FileNotFoundException