[英]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[])分配的,其他部分消耗的堆要低得多。 在 Allocation Tracker 中,我可以看到dalvik.system.NativeStart有很多带有3133456 byte[]的行。
它提出了一个问题:Android 是将所有本机库加载到内存中还是我做错了什么? 我需要一些很好的解释 Android 如何处理本机库。
如果没有真正有效的方法来减少本地库占用的堆空间(删除依赖不是一种选择,因为不仅Android使用它),那么还有其他方法可以降低GC频率吗?
编辑:添加图像以提供更多信息。
堆空间:
内存分配:
我发布的参考资料对那些遇到同样问题和缺乏主题信息的人有用。
我在这里找到了一个答案https://stackoverflow.com/a/11312145/955107指出: GC_FOR_ALLOC本身并不是您的应用程序中存在问题的迹象:但是:
还有一个非常有用的信息来源是 Patrick Dubroy 的视频。 它让我更了解我的应用程序中发生了什么以及我需要在我的代码中分析什么: Google I/O 2011: Memory management for Android Apps 。 特别注意53分5秒和55分42秒的问答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.