0

首先,感谢您花时间查看我的问题。我目前在我正在开发的应用程序中遇到内存峰值问题。

我的意图是能够下载和处理大量的 HTML 数据,目前的原因是嵌套在 HTML 中的大型 base64 编码图像,我理解这不适合在移动平台上使用。作为记录,我目前正在三星 Galaxy S 上进行测试。此外,由于每个应用程序分配了更多内存,因此在 Galaxy Nexus 上不会出现此问题。

我的问题是,在处理大约 2.8mb 的大量 HTML 数据时,内存堆增加到大约 27-29mb,但分配的内存永远不会超过 18-19mb。当 HTML 被处理、保存和显示后,分配的内存恢复到 3-4mb 左右。如果我要再次下载和处理这个 HTML,这个过程会重复,我得到相同的内存使用,除了它似乎进一步增加了堆(这对我来说似乎没有必要),此时我收到一个Out of memory错误。

当我收到此错误时,通常是在使用下载 HTMLHttpGet或使用StringBuffer. 有时它是由BitmapXML 膨胀期间引起的。

任何帮助将不胜感激。

4

2 回答 2

0

如果你真的需要这么多内存,你几乎无能为力。手机内存有限。

释放内存不是瞬时的。释放所有内存可能需要多次迭代(并且每次迭代可能会间隔几秒钟执行)。

图像/可绘制对象使用过多内存的问题很常见。有时是内存泄漏;其他时候无法说出是什么原因造成的。

我在解析大型 xml 文件时也遇到了问题。我的解决方案是将这些文件拆分成更小的文件。另一种可能性是考虑不同 xml 解析器的优缺点(第一个谷歌结果:SAX parser vs XML pull parser)。也许使用一些专门针对内存使用问题开发的第三方实现?第三种选择是使用服务器将 xml 文件转换为更有效的格式。

于 2012-03-28T21:18:02.307 回答
0

最佳做法是不要分配大量内存。在从网络读取数据时处理流内数据,或将其流式传输到磁盘然后从那里读取。android:largeHeap 选项适用于所有运行 Android 3.0 或更高版本的设备,但这只会增加您可以分配的数量,而不会完全消除限制。

于 2012-04-04T21:42:00.473 回答