我正在参与使用相当繁重的本机库(~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的频率吗?
编辑:添加图片以提供更多信息。
堆积空间:
内存分配:
答案 0 :(得分:0)
我发布的参考文献对那些遇到相同问题且缺乏主题信息的人有用。
我在https://stackoverflow.com/a/11312145/955107找到了一个答案: GC_FOR_ALLOC 本身不是您的应用中的问题但是:
另一个非常有用的信息来源是Patrick Dubroy的视频。它让我更加了解我的应用程序中发生的事情以及我需要在代码中分析的内容: Google I/O 2011: Memory management for Android Apps。 特别关注53分5秒55分42秒的问答。