【发布时间】:2013-10-26 19:42:35
【问题描述】:
我有一个动态壁纸应用程序,它使用从网上下载的照片用作壁纸。
内存管理器显示我的应用正在使用 90MB 到 120MB 的内存(它是具有 1GB RAM 的设备)。那是很多。壁纸服务经常被终止,有时系统甚至恢复为默认静态壁纸。
虽然我彻底检查了任何内存泄漏,并且 HPROF 转储分析表明我只有 2 个大对象在使用:当前使用的位图作为壁纸(16MB - 这是预期的 4Mpix 图像)和类 android.content.res . 资源 (12MB),总大小为 32MB,如 HPROF 概览屏幕所示。
dumpsys meminfo 显示:
** MEMINFO in pid 1354 [com.myapp.lwp] **
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 16 16 16 112304 5274 993
Dalvik 41947 19316 41428 74572 53120 21452
Cursor 0 0 0
Ashmem 0 0 0
Other dev 20170 33176 3460
.so mmap 5690 2620 1504
.jar mmap 0 0 0
.apk mmap 64 0 0
.ttf mmap 6 0 0
.dex mmap 604 0 4
Other mmap 1035 300 272
Unknown 5127 472 5116
TOTAL 74659 55900 51800 186876 58394 22445
Objects
Views: 27 ViewRootImpl: 0
AppContexts: 4 Activities: 1
Assets: 3 AssetManagers: 3
Local Binders: 16 Proxy Binders: 23
Death Recipients: 0
OpenSSL Sockets: 1
我读到了这个:How do I discover memory usage of my application in Android?,但这并不能帮助我得出任何结论......
我也用过:
cat /proc/1354/statm
139422 29326 11550 2 0 10330 0
也没什么用。
DDMS 显示 63MB 堆大小。
我的问题是? 处理双倍屏幕尺寸图像的应用程序是否正常和预期? 如果没有,剩下的 60-90MB 是什么? (我总共减去了 HPROF 给我的 30MB)。 在我的应用程序中使用这么多内存可能会做错什么? 应用实际做什么:
1) Download list of photos (max 100) as JSON string and parse that string to get ids and urls for these photos.
2) Download first photo and save it to cache folder
3) Decode photo and if necessary resize it to fit 2Width*Height of screen (photos are actualy smaller that my Full HD screen).
4) Draw it on wallpaper canvas (and draw repeatedly while user is scrolling)
5) If on WIFI download next 10 photos to cache folder (without decoding, just saving)
我有其他更复杂的模式,同时使用更多照片,但以上内存使用量适用于最简单的场景。
不是连续使用的问题——内存在第一次启动后的描述如下: 如果我终止该服务,重新启动后它会使用 90MB。第一次打开选项屏幕后(小活动/对话框,有几个选项可供选择 - 除了背景可绘制对象外没有图形)内存使用量跃升至 124MB,并在屏幕关闭后返回到 112MB。第一次更换壁纸照片后,它会跳到 130+ 并返回到 120+。可能是因为在位图解码期间堆大小增加,然后保持不变。
我该怎么办?如何减少(如果可能的话)我的应用程序内存占用?还有哪里可以看?我不希望有现成的解决方案,但任何进一步的指导都会有所帮助......
【问题讨论】:
标签: android memory bitmap live-wallpaper hprof