Android下常见的内存泄露 经典
转自:http://www.linuxidc.com/Linux/2011-10/44785.htm
因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题。
于是有时遇到程序运行时不断消耗内存,最终导致OutOfMemery,程序异常退出,这就是内存泄露导致的。
我们现在就来总结一下可能导致内存泄露的情况:
查询数据库而没有关闭Cursor
在Android中,Cursor是很常用的一个对象,但在写代码是,经常会有人忘记调用close, 或者因为代码逻辑问题状况导致close未被调用。
- try {
- Cursor c = queryCursor();
- int a = c.getInt(1);
- ......
- c.close();
- } catch (Exception e) {
- }
虽然表面看起来,Cursor.close()已经被调用,但若出现异常,将会跳过close(),从而导致内存泄露。
所以,我们的代码应该以如下的方式编写:
- Cursor c = queryCursor();
- try {
- int a = c.getInt(1);
- ......
- } catch (Exception e) {
- } finally {
- c.close(); //在finally中调用close(), 保证其一定会被调用
- }
调用registerReceiver后未调用unregisterReceiver().
在调用registerReceiver后,若未调用unregisterReceiver,其所占的内存是相当大的。
而我们经常可以看到类似于如下的代码:- registerReceiver(new BroadcastReceiver() {
- ...
- }, filter); ...
这是个很严重的错误,因为它会导致BroadcastReceiver不会被unregister而导致内存泄露。
未关闭InputStream/OutputStream
在使用文件或者访问网络资源时,使用了InputStream/OutputStream也会导致内存泄露
Bitmap使用后未调用recycle()
根据SDK的描述,调用recycle并不是必须的。但在实际使用时,Bitmap占用的内存是很大的,所以当我们不再使用时,尽量调用recycle()以释放资源。
Context泄露
这是一个很隐晦的内存泄露的情况。
先让我们看一下以下代码:- 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);
- }
在这段代码中,我们使用了一个static的Drawable对象。
这通常发生在我们需要经常调用一个Drawable,而其加载又比较耗时,不希望每次加载Activity都去创建这个Drawable的情况。
此时,使用static无疑是最快的代码编写方式,但是其也非常的糟糕。
当一个Drawable被附加到View时,这个View会被设置为这个Drawable的callback (通过调用Drawable.setCallback()实现)。
这就意味着,这个Drawable拥有一个TextView的引用,而TextView又拥有一个Activity的引用。
这就会导致Activity在销毁后,内存不会被释放。
转载于:https://www.cnblogs.com/wliangde/p/3712619.html
Android下常见的内存泄露 经典相关推荐
- Android下常见的内存泄露
转自:http://www.linuxidc.com/Linux/2011-10/44785.htm 因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题. 于是有时遇到程序运行 ...
- Android中常见的内存泄露
内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏.内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会 ...
- Android开发中常见的内存泄露案例以及解决方法总结
Android开发中常见的内存泄露案例以及解决方法总结 参考文章: (1)Android开发中常见的内存泄露案例以及解决方法总结 (2)https://www.cnblogs.com/shen-hua ...
- java内部类内存泄漏,Android中常见的内存泄漏和解决方案
什么是内存泄漏? 简单点说,就是指一个对象不再使用,本应该被回收,但由于某些原因导致对象无法回收,仍然占用着内存,这就是内存泄漏. 为什么会产生内存泄漏,内存泄漏会导致什么问题? 相比C++需要手动去 ...
- Android面试题目(10) 内存泄露
android 中内存开发,需要很多内存泄漏的问题.最根本的原因是对象不该被GCRoots引用,可是对象被GCRoots引用到了,下面是常见的内存泄露问题: 1.InputManager 引起内存泄露 ...
- Android性能优化(1) 内存泄露 amp; 解决方案
前言 在Android中,内存泄露的现象十分常见:而内存泄露导致的后果会使得应用Crash 本文 全面介绍了内存泄露的本质.原因 & 解决方案,最终提供一些常见的内存泄露分析工具,希望你们会喜 ...
- .NET中常见的内存泄露问题——GC、委托事件和弱引用
其实吧,内存泄露一直是个令人头疼的问题,在带有GC的语言中这个情况得到了很大的好转,但是仍然可能会有问题. 一.什么是内存泄露(memory leak)? 内存泄露不是指内存坏了,也不是指内存没插稳漏 ...
- Android使用Handler造成内存泄露的分析及解决方法
Android使用Handler造成内存泄露的分析及解决方法 参考文章: (1)Android使用Handler造成内存泄露的分析及解决方法 (2)https://www.cnblogs.com/xu ...
- 常见造成内存泄露的原因
内存泄露造成原因 1.上下文对象 2.碎片 3.WindowManager等系统管理类 4.Map 5.List和Map類似 6.接口回调 7.View 8.handler 9.线程 10.第三方库 ...
最新文章
- 数组--将两个有序数组a,b合并成新的有序数组c
- Office for AI | 拯救互联网人崩溃瞬间
- 漫说单例模式--宝宝成长记 你真的了解了吗?
- nginx websocket proxy
- 《ASP.NET Core 微服务实战》-- 读书笔记(第11章)
- 5码默认版块_5个小众的生活学习类的宝藏App
- xy坐标正负方向_【笛卡尔坐标系】
- jqxWidgets 常用代码
- 坑了腾讯1624万!3人冒充老干妈员工诈骗腾讯 判决结果来了...
- Smart Client Software Factory 初试
- PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错
- python可以写前端吗_哪种ide能同时写java和前端代码?
- 云优后台提交显示parsererror_Web测试必备技能——F12定位bug属于前端还是后台
- Python编程PTA题解——输出星期名缩写
- 基于java火车购票系统
- ECDH_SECP256R1 + X9.63 KDF-SHA256
- arduino控制小车转向_利用XECU和激光雷达快速搭建入门级的自动驾驶小车
- 【c语言】C语言运动会系统
- CleanMyMacX2022苹果mac电脑应用软件
- Oracle 访问SQL Server的数据 (通过Oracle gataway)