代码之家  ›  专栏  ›  技术社区  ›  Daniel Benedykt

堆外的Android内存管理

  •  4
  • Daniel Benedykt  · 技术社区  · 15 年前

    我正在为Android开发一个应用程序,因为我们有很多图形,所以我们使用了很多内存。

    我监控内存堆的大小及其大约3-4 MB,当我做一些需要更多内存的事情时(然后返回到3),我会偷看5 MB。这不是什么大问题,但是一些其他的东西是在堆内存之外处理的,比如加载可绘制文件。

    例如,如果我在Eclipse外运行DDMS工具,并转到SysInfo,我会看到我的应用程序在Droid上占用了20MB,在g1上占用了12个,但两个应用程序的堆大小相同,因为数据相同,但图像不同。

    所以问题是: 我怎么知道是什么把内存从堆内存中带走的? 还有什么东西占用堆内存之外的内存?复杂布局(大树)?动画?

    谢谢

    丹尼尔

    2 回复  |  直到 15 年前
        1
  •  4
  •   Vidar Vestnes    15 年前

    位图对象占用大量内存 .

    例如,如果你的应用程序从网络下载了一个10kb的JPG,并使用BitmapFactory将其解码为位图,位图对象需要大约30-100kb的内存,这取决于你的图像分辨率。每像素3字节(每种颜色1字节)

    是的,所有类型的对象都使用内存,比如线性布局、图像视图等。如果您正在创建和销毁这些对象中的许多,例如,当您在图像中滚动/翻页时,将出现内存泄漏。gc()不能像我们希望的那样快速处理所谓的短期对象。

    *将视图对象的数量保持在一个稳定的级别**,并循环使用它们,而不是销毁和创建新的视图对象。

    裁判: http://developer.android.com/resources/articles/track-mem.html

    如果您的应用程序内存达到20MB,它可能会fc,因为位图工厂正在尝试解码下一个图像。

        2
  •  2
  •   sandos    15 年前

    一个明显的候选者是离线屏幕位图(Android提供双缓冲?),因为屏幕大小在Droid上有大约4倍的像素。