我想知道如何解决Android上我的应用程序的高内存使用问题。我在互联网上搜索,发现DDMS插件对于为我的应用程序进行堆内存转储很有用。然而这一点毫无用处。
应用程序“使用时间轴免费”显示使用了94 MB内存,而DDMS堆转储显示总共8.4 MB,可疑泄漏是资源文件。
当我从adb(dumpsys meminfo)生成转储时,我得到:
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 20 8 20 54588 39431 1892
Dalvik 6732 9952 6396 10756 10028 728
Cursor 0 0 0
Ashmem 184 0 184
Other dev 11462 1172 11384
.so mmap 2467 2072 1156
.jar mmap 0 0 0
.apk mmap 48 0 0
.ttf mmap 2 0 0
.dex mmap 1037 0 0
其他mmap 41 16 32
Unknown 46352 292 46348
TOTAL 68345 13512 65520 65344 49459 2620
我怎么知道这个巨大的内存消耗背后是什么。我的应用程序是一个前台监视器服务,它永远运行,有一些活动,每天访问几次。
感谢。
答案 0 :(得分:1)
最小化您的Android数据使用量。检查链接:http://engineroots.games4punk.com/minimize-your-android-data-usage/
答案 1 :(得分:0)
DDMS并获得堆内存转储。它只显示了8.4 MB的使用!
然后,在完全垃圾收集之后,您只使用8.4MB的堆空间(创建堆转储的净效果)。
请注意,如果您在Android 1.x / 2.x上运行此操作,则MAT不会报告位图占用的空间。始终尝试从Android 3.0+设备或模拟器转储堆。
当我从adb(dumpsys meminfo)生成转储时,我得到:
我的猜测是你在Android 1.x / 2.x设备或模拟器上运行它,并且你有很多位图内存。尝试在Android 3.0+环境中运行堆转储和其他测试。
另外,请记住adb dumpsys meminfo
不执行完整的垃圾收集,而转储HPROF文件则执行。 Android垃圾收集器已经过优化,可以最大限度地降低CPU利用率,因此不会尝试执行完整的垃圾回收。因此,在运行时,堆通常会填充垃圾,GC引擎会根据需要回收垃圾。