Android内存增长导致的堆碎片问题

25

我正在开发一个从互联网流媒体音乐的应用程序... 我的应用程序有很多功能,它的结构是这样的:我有一个选项卡视图,每个视图都分配在内存中,因此每次我通过选项卡导航时,都会再次找到先前的状态(每个选项卡也可以打开Webview,在互联网上查找有关歌曲、新闻等的信息)..这一切增加了内存占用,但使应用程序非常用户友好.. 在遵循Android指南避免内存泄漏后,我尝试查看堆占用情况,发现我的应用程序最多分配了3.5MB的内存,而分配的堆大小为4.5-4.6MB...我正在模拟器上工作.. 我认为它们不算太多,但有时我的应用程序会重新启动,并在LogCat中发现奇怪的消息,如下:

Grow heap ( frag case ) to 3.373 for 19764-byte allocation

这是什么问题?模拟器问题还是其他问题?我是否使用了太多内存?

先感谢您的任何帮助 :)

1个回答

36

最大堆大小取决于设备(您可以通过调用Runtime.getRuntime().maxMemory()来获取该值),但可能大约为32MB。为了节省内存,Android不会自动将最大内存分配给每个应用程序。相反,它会等待应用程序需要更多内存,然后根据需要为其提供更多的堆空间,直到达到最大值。我相信这就是您看到的“增长堆”消息。

如果您进行大量的内存分配和释放,则可能会遇到碎片问题。维基百科在此处有一个不错的描述,但基本上意味着您可能已经具有所需的内存,只是没有全部在一个块中,因此需要扩大堆。

因此,回答您的问题,这可能不是模拟器问题,而只是您的程序性质,听起来有点占用内存。但是这并不是一件坏事。我认为使用3-5MB的多个带Web视图的选项卡并不算过多。


哦,谢谢您的回答 ^^ 为什么这不是一件坏事?当发生这种情况时,我的应用程序会退出...我认为这是不好的...这是我的错吗?我收到另一条消息:heapworker卡住了:在Landroid/media/MediaPlayer;.finalize()V内花费了13129ms...您知道这是什么吗? - Erenwoid
是的,如果您的应用程序退出,那就不好了。我指的是为多个网页只使用4MB堆不错。我对“HeapWorker”问题不太了解。通常它会跟踪已分配的内存并在未使用的对象上运行垃圾收集器。我猜想您的其中一个线程正在使用所有CPU,并且“MediaPlayer”没有足够的时间运行“finalize()”,这绝对不应该花费13秒钟的功能。 - Steve Blackwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接