所以,我完成了一个项目,现在我面临的主要问题是应用程序中的内存泄漏(“泄漏”意味着您保留对某个活动的引用,因此阻止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作为上下文创建的,所以在这种情况下,有一个引用Activity的Drawable的静态引用,这就是泄漏的原因。只要该引用存在,Activity就会保留在内存中,泄露其所有视图。
引起注意的第二种情况是屏幕方向改变时。当屏幕方向改变时,系统默认会破坏当前活动并创建新活动,同时保留其状态。这样,Android将从资源重新加载应用程序的UI。现在假设你编写了一个带有大位图的应用程序,你不想在每次轮换时加载它。
这会导致大量内存泄漏,因为可能需要加载大的位图。
第三种情况,我发现是对活动上下文的引用。它还会导致内存泄漏。
我想知道是否有任何简单的方法可以避免此类内存泄漏 发生。或者是否有可以检查和删除它们的工具 应用程序的内存泄漏。
答案 0 :(得分:10)
您可以使用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
答案 1 :(得分:10)
我知道这是一篇旧帖子,但最近Square发布了一个名为LeakCanary的库,它是远找到内存泄漏的最优雅的解决方案。