Android应用程序内存问题

Android应用程序内存问题,android,memory-management,out-of-memory,Android,Memory Management,Out Of Memory,我正在制作一个用于观看电影的应用程序,它在网格、列表和水平滚动视图中显示类别和电影的图像。 该应用程序有几个活动,每个活动中都显示图像。问题是当用户只向前更改活动时,在一点上应用程序会崩溃,OutOfMemory例外 使用Heap和MAT工具,我发现位图在每个活动中都使用了大量的堆内存。在同一款手机上,如三星Galaxy S4和阿尔卡特OneTouch Idol全高清显示,应用程序只需2-3次活动就崩溃了。这太疯狂了:) 所以,我的问题是,我如何用记忆克服这个问题? 我知道这是一个普通的安卓系统

我正在制作一个用于观看电影的应用程序,它在网格、列表和水平滚动视图中显示类别和电影的图像。 该应用程序有几个活动,每个活动中都显示图像。问题是当用户只向前更改活动时,在一点上应用程序会崩溃,OutOfMemory例外

使用Heap和MAT工具,我发现位图在每个活动中都使用了大量的堆内存。在同一款手机上,如三星Galaxy S4和阿尔卡特OneTouch Idol全高清显示,应用程序只需2-3次活动就崩溃了。这太疯狂了:)

所以,我的问题是,我如何用记忆克服这个问题? 我知道这是一个普通的安卓系统问题,但我必须做些什么来解决这个问题

每个图像都针对其位置进行了优化(在附加到图像视图之前,精确测量图像尺寸)。 干杯。

做一些分析

您没有提供任何代码或日志。因此,我将告诉您我遵循的基本方法

开始你的第一项活动。继续运行adb外壳转储系统“PID”或“PackageName”

在复制活动时获取信息。 执行
adb shell“true;do dumpsys meminfo 22188;done;”>dumpsysOfsmthn.txt

* MEMINFO in pid 22188 [com.sec.android.smthn] **

                   Pss  Private  Private  Swapped     Heap     Heap     Heap

                 Total    Dirty    Clean    Dirty     Size    Alloc     Free

                ------   ------   ------   ------   ------   ------   ------

  Native Heap       44       44        0        0    11132    10455      184

  Dalvik Heap    19189    18804        0        0    25660    19221     6439

 Dalvik Other     3891     3828        0        0                           

        Stack      200      200        0        0                           

       Ashmem        2        0        0        0                           

    Other dev     8168     7844        4        0                           

     .so mmap     1990     1032      508        0                           

    .jar mmap        5        0        4        0                           

    .apk mmap      315        0      124        0                           

    .ttf mmap       21        0        4        0                           

    .dex mmap     6553      248     5584        0                           

   Other mmap       90        4       20        0                           

      Unknown     5743     5740        0        0                           

        TOTAL    46211    37744     6248        0    36792    29676     6623



 Objects

               Views:       39         ViewRootImpl:        1

         AppContexts:        4           Activities:        1

              Assets:        3        AssetManagers:        3

       Local Binders:       78        Proxy Binders:       42

    Death Recipients:        2

     OpenSSL Sockets:        0



 SQL

         MEMORY_USED:      286

  PAGECACHE_OVERFLOW:       53          MALLOC_SIZE:       62



 DATABASES

      pgsz     dbsz   Lookaside(b)          cache  Dbname

         4       24             53         2/17/3  /data/data/com.sec.android.smthn/databases/sns.db

         4       32             55         1/13/2  /data/data/com.sec.android.smthn/databases/picasa.db

         4       36             27        10/17/3  /data/data/com.sec.android.smthn/databases/local.db

Applications Memory Usage (kB):

Uptime: 31556347 Realtime: 96096816
检查哪部分比例在不断增加

它可以是ViewRootImpl或活动上下文或任何内容

以上信息可能会给你一些线索

如前所述,使用MAT或JHAT进行heapdump分析。 Mat是一种女性工具

you should look for memory leaks caused by:

Long-lived references to an Activity, Context, View, Drawable, and other objects that may hold a reference to the container Activity or Context.
Non-static inner classes (such as a Runnable, which can hold the Activity instance).
Caches that hold objects longer than necessary.
任何对象都可能导致泄漏。通常位图很大。如果很容易出现内存不足的情况,则需要检查位图等重对象

对于垫子和泄漏的理解

还有

此外,除了上述内容,您还可以使用DDMS分配跟踪器获取更多线索>是的,没有什么比这更好的数据了


也请查看此帖子

发布有关位图的代码。很抱歉,系统太大,无法发布代码。:)基本上,我必须回收堆内存,而不是当用户只是继续使用活动时。我需要有人向我解释一下,当活动暂停并放在后台以及显示其他活动时,视图及其位图和内存通常会发生什么。