所以,我完成了一个项目,现在我面临的主要问题是应用程序中的 Memory Leakage (“泄漏”意味着您保留对活动的引用,从而阻止GC收集它)
我发现的一些发生内存泄漏的案例是:
上下文泄漏
这是因为对活动上下文的长期引用 .
我找到了一个非常好的例子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);
}
这里的问题是 private static Drawable sBackground;
静态Drawable是以Activity作为上下文创建的,所以在这种情况下,有's a static reference to a Drawable that references the Activity, and that'为什么会有泄漏 . 只要该引用存在,Activity就会保留在内存中,泄露其所有视图 .
屏幕方向更改
引起注意的第二种情况是屏幕方向改变时 . 当屏幕方向改变时,系统默认会破坏当前活动并创建新活动,同时保留其状态 . 这样,Android将从资源重新加载应用程序的UI . 现在假设您编写了一个带有大位图的应用程序,您不希望在每次轮换时加载该位图 .
这将导致大量内存泄漏,因为可能需要加载大的位图 .
上下文活动
第三种情况,我发现是对活动上下文的引用 . 它还会导致内存泄漏 .
我想知道是否有任何简单的方法可以避免这种内存泄漏的发生 . 或者是否有工具可以检查并从应用程序中删除这些内存泄漏 .
2 回答
您可以使用traceview或内存分析器等工具来检查内存泄漏
http://developer.android.com/tools/help/traceview.html
http://kohlerm.blogspot.com/2009/04/analyzing-memory-usage-off-your-android.html
以下是我发现有用的一些文章
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
http://vahidmlj.blogspot.com/2012/10/android-memory-leak-on-screen-rotation.html
我知道这是一个老帖子,但最近Square发布了一个名为LeakCanary的库,这是迄今为止找到内存泄漏的最优雅的解决方案 .