集合中的对象未清理造成内存泄露 这个比较好理解,如果一个对象放入到 ArrayList 、 HashMap 等集合中,这个集合就会持有该对象的引用。当我们不再需要这个对象时,也并没有将它从集合中移除,这样只要集合还在使用(而 此对象已经无用了),这个对象就造成了内存泄露。并且如果集合被静态引用的话,集合里面那 些没有用的对象更会造成内存泄露了。所以在使用集合时要及时将不用的对象从集合 remove ,或 者 clear 集合,以避免内存泄漏。
资源未关闭或释放导致内存泄露 在使用 IO 、 File 流或者 Sqlite 、 Cursor 等资源时要及时关闭。这些资源在进行读写操作时通常都使用了缓冲,如果及时不关闭,这些缓冲对象就会一直被占用而得不到释放,以致发生内存泄露。因此我们在不需要使用它们的时候就及时关闭,以便缓冲能及时得到释放,从而避免内存泄露。
属性动画造成内存泄露 动画同样是一个耗时任务,比如在 Activity 中启动了属性动画( ObjectAnimator ),但是在销毁 的时候,没有调用 cancle 方法,虽然我们看不到动画了,但是这个动画依然会不断地播放下去, 动画引用所在的控件,所在的控件引用 Activity ,这就造成 Activity 无法正常释放。因此同样要 在 Activity 销毁的时候 cancel 掉属性动画,避免发生内存泄漏。
@Overrideprotected void onDestroy() {
super.onDestroy();
mAnimator.cancel();
}
WebView 造成内存泄露 造成内存泄露 关于 WebView 的内存泄露,因为 WebView 在加载网页后会长期占用内存而不能被释放,因此我 们在 Activity 销毁后要调用它的 destory() 方法来销毁它以释放内存。 另外在查阅 WebView 内存泄露相关资料时看到这种情况: Webview 下面的 Callback 持有 Activity 引用,造成 Webview 内存无法释放,即使是调用了 Webview.destory() 等方法都无法解决问题(Android5.1 之后)。 最终的解决方案是:在销毁 WebView 之前需要先将 WebView 从 父容器中移除,然后在销毁 WebView 。 详细分析过程请参考这篇文章: [](http://blog.csdn.net/xygy8860/article/details/53334476?utm_source=itdadao&utm_medium =referral)(http://blog.csdn.net/xygy8860/article/details/53334476)[WebView 内存泄漏解决方 法]。
@Overrideprotected void onDestroy() {
super.onDestroy();
// 先从父控件中移除 WebView
mWebViewContainer.removeView(mWebView);
mWebView.stopLoading();
mWebView.getSettings().setJavaScriptEnabled(false);
mWebView.clearHistory();
mWebView.removeAllViews();
mWebView.destroy();
}
总结 内存泄露在 Android 内存优化是一个比较重要的一个方面,很多时候程序中发生了内存泄露我们 不一定就能注意到,所有在编码的过程要养成良好的习惯。总结下来只要做到以下这几点就能避 免大多数情况的内存泄漏: 构造单例的时候尽量别用 Activity 的引用; 静态引用时注意应用对象的置空或者少用静态引用; 使用静态内部类+软引用代替非静态内部类; 及时取消广播或者观察者注册; 耗时任务、属性动画在 Activity 销毁时记得 cancel ; 文件流、 Cursor 等资源及时关闭; Activity 销毁时 WebView 的移除和销毁。
|