如何在`setContentView()`中对大内存分配进行分类?

时间:2013-08-15 13:01:33

标签: android android-layout out-of-memory

我们正在开发一款Android应用程序,可以充分利用图像(小型和大型)。我们的主屏幕有一个图像的“拼贴”。我们通过the usual mechanisms调试了一系列“内存泄漏”......但是刚刚注意到我们在主setContentView中对Activity的调用导致了非常大的内存分配:

  

08-14 15:27:30.688:D / BEFORE setContentView PJK 6 CollageActivity(21845):debug.memory:已分配:49.05MB的192.00MB(19.22MB免费)
  08-14 15:27:31.049:D / AFTER setContentView PJK 7 CollageActivity(21845):debug.memory:已分配:64.68MB的192.00MB(15.22MB免费)

(这是从Nexus 4设备中获取的)。

我们尚未尝试的上述SO问题中唯一的问题是生成不同比例的背景图像。这只占3,932,160(= 1280 x 768 x 4)字节的分配。

DDMS(和MAT)显示位图有大量分配:

MAT

有没有办法弄清楚我们布局的哪个部分导致如此大的分配(16,384,064字节!)? (虽然我只是将图像重新缩放到那个尺寸,但没有帮助。)


修改

深入挖掘,我从android:background删除了LinearLayout drawable:

   <LinearLayout
    android:id="@+id/collage_activity_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg_collage"
    android:orientation="horizontal" >

离开时的内存分配!关于为什么800 x 1280背景(应生成800 x 1280 x 4 = 4,096,000字节图像)实际生成16MB图像的任何想法?可能是因为800(图像尺寸)和768(屏幕尺寸)之间存在差异吗?

2 个答案:

答案 0 :(得分:2)

我们必须做两件事来解决这个问题:

  1. 我们使用的背景图片是JPG。将图像更改为PNG(两种方向)将使用量从16MB减少到大约8MB。

  2. 图像也必须按比例缩小25%。这为我们提供了更易于管理的每个方向更改(大约2MB)。

答案 1 :(得分:-1)

是的,我们可以在调试模式下看到堆增长,并更新堆线程以查看运行时的堆更新。 只需转到DDMS并调试您的应用程序进程并单击更新堆按钮,然后在右侧的堆选项卡中查看