Android 本机库和内存消耗

Android native libraries and memory consumption

我正在参与 Android 应用程序的开发,该应用程序使用大量本机库 (~20Mb)。实际问题是 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[] for dalvik.system.NativeStart.

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

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

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

堆space:

内存分配:

我发布的参考资料可能对那些遇到相同问题但缺乏相关信息的人有用。

我在这里 找到了一个答案,其中指出: GC_FOR_ALLOC 本身 不是问题的迹象 然而:

  • Android 应用程序从一个不断增长的小堆开始(最多 点)当应用程序需要越来越多的内存时, 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秒的问答