我的应用使用的服务是我在主要活动的onCreate()
方法中启动的。当我第一次在平板电脑上启动应用程序,并查看设置/应用程序/正在运行中正在运行的应用程序时,它会显示我的服务正在运行并消耗了11MB的RAM。
现在,如果我通过旋转设备循环活动的生命周期20次,然后返回设置/应用程序/正在运行,则表明我现在正在使用29MB的RAM。
起初我认为这必然是由于内存泄漏,但在循环活动的生命周期之前和之后进行堆转储后,我似乎没有泄漏任何对象。下面是MAT的截图,其中标题为Objects #0
的列在循环之前列出了我的对象的实例,标题为Objects #1
的列列出了循环后我的对象的实例。
和所有对象
似乎没有任何明显的内存泄漏,但我无法理解为什么在每个方向/生命周期后 Settings / Apps / Running 中的RAM使用量会增加。我在这里错过了什么吗?当我似乎没有任何内存泄漏时,为什么我的RAM使用量明显增加?
更新
我的应用在每个方向更改上消耗更多RAM的原因是从资源创建自定义字体的结果。我创建了一个自定义TypefacedTextView
(可以看作上面屏幕截图中的一个对象),每次创建视图时,它都会将字体重新加载到内存中。删除TypefacedTextViews
已修复此问题。使用带有命令shell dumpsys meminfo my.package.com
的adb工具清楚地表明了问题,该工具列出了我丰富的字体资产分配。
答案 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,它本身具有对活动的引用 (上下文)反过来引用了几乎任何东西 (取决于你的代码。)
由于您正在谈论方向更改中的内存泄漏,您很可能会在帖子中详细说明作者的详细信息。