For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
内存管理是大多数软件编程开发程序员都需要熟练掌握的一个编程技术,而本文我们就通过案例分析来简单了解一下,造成内存泄露的问题场景分享。
1、单例模式导致的内存泄漏
问题原因:
单例模式的内存泄漏一般是由上下文的生命周期引起的。因为单例模式的静态特性导致它的生命周期和应用的生命周期一样长,
当单例引用了比它生命还短的对象时候,将导致这个短生命周期的对象无法被释放掉,从而导致内存泄漏。如下示例代码,模拟了单例导致的内存泄漏。
解决方式:
当然解决办法也很简单,只需要将引用对象的生命和单例类一致就OK了。
通常的做法是将传入单例的的上下文参数做下转换调用它的getApplicationContext()即可。
2、匿名内部类导致的内存泄漏
问题原因:
匿名类、非静态内部类都会引用它们所属的外部类,当这些内部类进行一些耗时操作的时候就会导致外部类的实例无法被释放掉,从而导致内存泄漏的发生。
解决方法:
将非静态匿名内部类修改成静态匿名内部类
3、Handler引起的内存泄漏
问题原因:
当Handler中有延迟的的任务或是等待执行的任务队列过长,由于消息持有对Handler的引用,而Handler又持有对其外部类的潜在引用,这条引用关系会一直保持到消息得到处理,
而导致了Activity无法被垃圾回收器回收,而导致了内存泄露。
解决方法:
将Handler定义成静态内部类,在界面的onDestroy方法移除消息回调等。
4、注册监听器的泄漏
注册和解注册一定要配对出现,否则就会出现内存泄漏。例如我们在activity的的onCreate方法注册了动态广播,那么在onDestroy()中就的解注册该动态广播
5、IO流数据库之类导致的内存泄漏
OutputStream、InputStream以及相关的子类需要在finally块中进行及时关闭释放资源。数据库主要是Cursor游标、数据库的关闭。
6、集合中对象没清理造成的内存泄漏
我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,
这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。所以退出界面集合需要清空并设置为null
7、WebView造成的泄漏
对于显示webview的组件activity设置单独的运行进程,可以处理简单无交互的webview显示网页,
在退出界面的时候杀死进程或者退出整个进程即可。对于复杂的需要和启动方主进程交互的需要使用aidl方式进行进程间通信。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。