Android本机库和内存消耗

时间:2015-04-10 10:55:14

标签: java android debugging memory heap

我正在参与使用相当繁重的本机库(~20Mb)的Android应用程序的开发。实际问题是GC经常工作以恢复一些(但不是太多)内存。每秒多次。

04-10 12:16:05.391  18940-18951/com.some.demo D/dalvikvm﹕ GC_FOR_ALLOC freed 6120K, 29% free 31708K/44359K, paused 20ms, total 20ms
04-10 12:16:05.501  18940-18951/com.some.demo D/dalvikvm﹕ GC_FOR_ALLOC freed 6121K, 29% free 31708K/44359K, paused 23ms, total 23ms
04-10 12:16:05.601  18940-18951/com.some.demo D/dalvikvm﹕ GC_FOR_ALLOC freed 6120K, 29% free 31708K/44359K, paused 23ms, total 23ms
04-10 12:16:05.702  18940-18951/com.some.demo D/dalvikvm﹕ GC_FOR_ALLOC freed 6120K, 29% free 31708K/44359K, paused 25ms, total 25ms
04-10 12:16:05.802  18940-18951/com.some.demo D/dalvikvm﹕ GC_FOR_ALLOC freed 6120K, 29% free 31708K/44359K, paused 28ms, total 28ms
04-10 12:16:05.902  18940-18951/com.some.demo D/dalvikvm﹕ GC_FOR_ALLOC freed 6120K, 29% free 31708K/44359K, paused 28ms, total 28ms
04-10 12:16:06.002  18940-18951/com.some.demo D/dalvikvm﹕ GC_FOR_ALLOC freed 6120K, 29% free 31708K/44359K, paused 26ms, total 26ms
04-10 12:16:06.122  18940-18951/com.some.demo D/dalvikvm﹕ GC_FOR_ALLOC freed 6120K, 29% free 31708K/44359K, paused 41ms, total 41ms

在Android设备监视器(堆选项卡)工具中,我可以看到> 25 MB由 1字节数组(byte [],boolean [])分配,其他部分消耗更低的堆。 在分配跟踪器中,我可以看到很多行 3133456 byte [] ,用于 dalvik.system.NativeStart

它提出了一个问题:Android是否将所有本机库加载到内存中或者我做错了什么?我需要一些很好的解释,Android如何处理本地库。

如果没有真正有效的方法来减少本机库占用的空间(删除依赖项不是一个选项,因为不仅Android使用它),那么还有其他方法可以降低GC的频率吗?

编辑:添加图片以提供更多信息。

堆积空间: Heap

内存分配: Allocation

1 个答案:

答案 0 :(得分:0)

我发布的参考文献对那些遇到相同问题且缺乏主题信息的人有用。

我在https://stackoverflow.com/a/11312145/955107找到了一个答案: GC_FOR_ALLOC 本身不是您的应用中的问题但是:

  • Android应用程序从一个增长的小堆开始(最多为一个 当应用程序需要越来越多的内存时,和a GC_FOR_ALLOC在增加堆大小之前完成。在这 case GC_FOR_ALLOC完全正常。
  • 如果您分配内存的速度快于并发GC有时间释放的速度 它,GC_FOR_ALLOC是不可避免的。而且根本没有任何东西 分配内存的速度比并发GC可以释放的速度快 记忆。

另一个非常有用的信息来源是Patrick Dubroy的视频。它让我更加了解我的应用程序中发生的事情以及我需要在代码中分析的内容: Google I/O 2011: Memory management for Android Apps。 特别关注53分5秒55分42秒的问答。