记忆和活动:: OutOfMemory

Yah*_*hel 5 memory android themes

建立 :

我有这个应用程序,它在线性路径中有4个活动,非常简单的导航:A - > B - > C - > D.

所有活动共享相同的背景图像,并且都有一些常规按钮,textview或edittext.所有这些都在单独的视图xml文件中定义.

背景是渐变,有点沉重.大约3兆作为未压缩的位图.

该应用程序尚未执行任何操作,其中唯一的逻辑是启动活动并按下按钮单击它们

我试图使用MAT来查找内存泄漏但找不到任何内容.我的应用程序中保留的最大大小为656(ko?),应用程序的总保留大小为1520(ko?),我找不到任何可复制的对象.顺便说一下,dumpsys显示分配了27300(ko?)

问题 :

  1. 当我向上导航时,我看到相当于背景大小的内存使用量的增加.
  2. 当我导航DOWN,使用后退按钮或完成命令关闭活动时,应用程序的内存使用量不会减少.
  3. 如果我从A转到D然后再回到B并旋转屏幕,app力将以OutOfMemory异常关闭.

问题:

更新:我想真正的问题是为什么我有一个巨大的内存泄漏(一次5兆),冻结时应用程序大小为27megs,我在MAT中看不到它?

  1. 为什么Android会在同一背景下多次解压缩,每次活动一次?似乎效率低下.
  2. 是否有可能通过使用主题来克服这个问题,或者我会看到相同的"按活动分配1个背景"的怪异?
  3. 为何活动在关闭时无法收回?
  4. 为什么MAT和dumpsys呈现不同的数字?

线索

在同一时间我有:dumpsys meminfo:

Applications Memory Usage (kB):
Uptime: 74006853 Realtime: 110962243

** MEMINFO in pid 22683 [com.kayenko.sosadresse] **
                    native   dalvik    other    total
            size:    20820     5767      N/A    26587
       allocated:    18751     2901      N/A    21652
            free:      312     2866      N/A     3178
           (Pss):     1357      201    16782    18340
  (shared dirty):     2264     1804     5456     9524
    (priv dirty):     1280      116    16032    17428

 Objects
           Views:        0        ViewRoots:        0
     AppContexts:        0       Activities:        0
          Assets:        2    AssetManagers:        2
   Local Binders:       18    Proxy Binders:       16
Death Recipients:        1
 OpenSSL Sockets:        0

 SQL
               heap:        0         MEMORY_USED:        0
 PAGECACHE_OVERFLOW:        0         MALLOC_SIZE:        0
Run Code Online (Sandbox Code Playgroud)

而这个统治者树:

MAT Dominator树

Thansk对任何想知道我想要寻找的人都有所了解.

Xav*_*Gil 7

内存在Android中是一个非常棘手的主题.

每个应用都会获得堆内存限制,具体取决于设备.此堆内存是dalvik内存加本机内存,您可以将其视为dumpsys meminfo结果中的总列.dalvik内存处理除了位图之外的所有内容,这些内容在本机内存中分配(在Honeycomb之前的Android版本中也是如此).

说过我只能回答你的一些问题:

  1. 据我所知,Android将始终为Bitmaps分配内存,即使它们是相同的.因此,在您的情况下,每个活动都会为您的后台分配内存.

  2. 我不知道它是否更适合使用主题,你必须尝试.

  3. 一方面,当设备有足够的内存来处理下一个活动时,不会回收活动.当您按下后退按钮时,每个活动都被推到一堆.如果Android需要更多内存,它会从堆中删除一个活动来释放其内存(回到第一个问题,也许这就是不共享内存的原因).另一方面,您可以设置活动launchMode以更改此行为(请查看此处).

  4. 我认为MAT不会显示本机内存数据.使用dumpsys meminfo本机列查看您拥有的位图分配的内存量.

我自己很难处理OutOfMemory问题.现在我对它的工作方式有了更清晰的认识,我能够处理大文件而不会耗尽内存.我强烈推荐这两个对我有帮助的资源:

祝好运!