如何在 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 中时,您不会使用堆,但在某些情况下它确实会增长。我使用StringBuilder
的ensureCapacity(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 api 8 (Froyo) 添加 PBKDF2WithHmacSHA1