了解Android App RAM使用情况

时间:2014-03-25 14:24:01

标签: android memory-leaks ram

我的应用使用的服务是我在主要活动的onCreate()方法中启动的。当我第一次在平板电脑上启动应用程序,并查看设置/应用程序/正在运行中正在运行的应用程序时,它会显示我的服务正在运行并消耗了11MB的RAM。

现在,如果我通过旋转设备循环活动的生命周期20次,然后返回设置/应用程序/正在运行,则表明我现在正在使用29MB的RAM。

起初我认为这必然是由于内存泄漏,但在循环活动的生命周期之前和之后进行堆转储后,我似乎没有泄漏任何对象。下面是MAT的截图,其中标题为Objects #0的列在循环之前列出了我的对象的实例,标题为Objects #1的列列出了循环后我的对象的实例。

My objects after cycling

和所有对象

enter image description here

似乎没有任何明显的内存泄漏,但我无法理解为什么在每个方向/生命周期后 Settings / Apps / Running 中的RAM使用量会增加。我在这里错过了什么吗?当我似乎没有任何内存泄漏时,为什么我的RAM使用量明显增加?

更新

我的应用在每个方向更改上消耗更多RAM的原因是从资源创建自定义字体的结果。我创建了一个自定义TypefacedTextView(可以看作上面屏幕截图中的一个对象),每次创建视图时,它都会将字体重新加载到内存中。删除TypefacedTextViews已修复此问题。使用带有命令shell dumpsys meminfo my.package.com的adb工具清楚地表明了问题,该工具列出了我丰富的字体资产分配。

1 个答案:

答案 0 :(得分:0)

有一篇简短的博客文章,我相信它仍然掌握了很多信息。你可以找到它here

在其中,如果您错误地管理了您的“活动”引用,您会发现可能/将要发生的事情:

private static Drawable sBackground;

@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);

  TextView label = new TextView(this);
  label.setText("Leaks are bad");

  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);

  setContentView(label);
}
  

这段代码非常快,也非常错误;它泄漏了第一个   在第一次屏幕方向更改时创建的活动。当一个   Drawable附加到视图上,视图设置为回调   绘制。在上面的代码片段中,这意味着drawable有一个   引用TextView,它本身具有对活动的引用   (上下文)反过来引用了几乎任何东西   (取决于你的代码。)

由于您正在谈论方向更改中的内存泄漏,您很可能会在帖子中详细说明作者的详细信息。