我有一个动态壁纸应用程序,它使用从网上下载的照片用作壁纸。
内存管理器显示我的应用程序使用的是90MB到120MB(这是一个1GB RAM的设备)。那是很多。壁纸服务经常被杀死,有时系统甚至会恢复默认的静态壁纸。
虽然我彻底检查了任何内存泄漏,但HPROF转储分析显示我只有2个正在使用的大对象:目前使用Bitmap for wall(16MB - 这是4Mpix图像的预期)和类android.content.res 。在HPROF概述屏幕中报告的资源(12MB)总共32MB。
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+。可能是因为在位图解码期间堆大小增加然后保持这种状态。
我该怎么办?如何减少(如果可能的话)我的应用程序内存占用?还有什么地方看?我不希望现成的解决方案,但任何进一步的指导可以帮助......
答案 0 :(得分:1)
我在处理我的应用程序时遇到了同样的问题。 DUMP和GC(来自Logcat)都表明我使用了大约30-50 MB的内存,上下波动,这是正常的,因为GC在不同的时间运行。
然而,出于某种原因,似乎进程RAM的使用只是在积累并且没有被释放,特别是如果你有一个正在运行的服务。我的过程显示我的内存超过300 MB,因此我不确定它是否刚刚发布(已经过GC)或者它已被泄露。
我要做的是验证是,我在关闭应用程序后让它暂停一段时间,并且在几个小时内它显示我的服务仅使用3 MB的RAM,同时,我打开了许多应用程序(强制Android到执行GC)并再次从300 MB返回到3 MB而不会中断我的服务,所以我认为它只是在没有GC的情况下继续构建它,所以它没有泄露。
这仍然不是一个足够好的保险,但它总比没有好,我正在努力寻找更多关于它的信息,希望有所帮助。
如果您找到解决该问题的方法,请告诉我,谢谢。