【问题标题】:My android application memory usage too large (as reported by memory managers)我的 android 应用程序内存使用量太大(由内存管理器报告)
【发布时间】: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


    【解决方案1】:

    我在处理我的应用程序时遇到了同样的问题。 DUMP 和 GC(来自 Logcat)都表明我使用了大约 30-50 MB 的内存,上下波动,这是正常的,因为 GC 在不同的时间运行。

    但是,由于某种原因,进程 RAM 的使用似乎只是在增加而没有被释放,尤其是在您有正在运行的服务的情况下。我的过程显示我使用了超过 300 MB 的 RAM,所以我不确定它是没有被释放(已经被 GCed)还是被泄露了。

    我所做的验证是,我在关闭应用程序后让它等待了一段时间,并且在几个小时内它显示我的服务仅使用 3 MB 的 RAM,此外,我打开了许多应用程序(强制 Android执行 GC),然后它又从 300 MB 回到 3 MB 而没有杀死我的服务,所以我认为它只是在没有 GC 的情况下继续构建它,所以它没有泄露。

    这仍然不是一个足够好的保险,但总比没有好,我正在努力寻找更多关于它的信息,希望能有所帮助。

    如果您找到解决该问题的方法,请告诉我,谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2011-11-02
      • 2011-01-08
      • 1970-01-01
      相关资源
      最近更新 更多