每日一问:Android 中内存泄漏都有哪些注意点?
内存泄漏对每一位 Android 开发一定是司空见惯,大家或多或少都肯定有些许接触。大家都知道,每一个手机都有一定的承载上限,多处的内存泄漏堆积一定会堆积如山,最终出现内存爆炸 OOM。
而这,也是极有可能在 Android 面试中一道常见的开放题。
内存泄漏的根本原因是一个长生命周期的对象持有了一个短生命周期的对象。如果你对垃圾回收机制有所了解,我想这个问题基本难不住你,因为知道了原理,自然不会去触碰这些极易导致内存泄漏的雷区。
该题重在积累,不需要死记硬背,自己多总结即可。
1. 长生命周期对象持有 Activity
这基本是最常见的内存泄漏了,比如
- 内部类形式使用 Handler 同时发送延时消息,或者在 Handler 里面执行耗时任务,在任务还没完成的时候 Activity 需要销毁。这时候由于 Handler 持有 Activity 的强引用导致 Activity 无法被回收。
- 同理内部类形式的使用 AsyncTask 执行耗时任务也会导致内存泄漏的发生。
- 单例作为最长生命周期的对象,自然不应该持有 Activity 从而导致内存泄漏发生;
针对上面这种情况,基本不必多说了,不要使用内部类或者匿名内部类做这样的处理就好了,实际上 IDE 也会弹出警告,我想大家应该还是都知道采用静态内部类或者在销毁页面的时候使用相关方法移除处理的。
Activity中匿名使用Handler实际上会导致Handler内部类持有外部类的引用,而SendMessage()的时候Message会持有Handler,enqueueMessage机制又会导致MeassageQueue持有Message。所以当发送的是延迟消息那么Message并不会立即的遍历出来处理而是阻塞到对应的Message触发时间以后再处理。那么阻塞的这段时间中页面销毁一定会造成内存泄漏。
2. 各种注册操作没有对应的反注册
这一点基本不必多说,相信大家刚刚开始学习广播和 Service 的时候一定对此有所接触,然后就是比如我们常用的第三方框架 EventBus 也是一样的。平时使用的时候注意在对应的生命周期方法中进行反注册。
3. Bitmap 使用完没有注意 recycle()
Bitmap 作为大对象,在使用完毕一定要注意调用 recycle() 进行回收。TypedArray 、Cursor、各种流同理,一定要在最后调用自己的回收关闭方法处理。
4. WebView 使用不当
WebView 是非常常用的控件,但稍有不注意也会导致内存泄漏。内存泄漏的场景: 很多人使用 Webview 都喜欢采用布局引用方式, 这其实也是作为内存泄漏的一个隐患。当 Activity 被关闭时,Webview 不会被 GC 马上回收,而是提交给事务,进行队列处理,这样就造成了内存泄漏, 导致 Webview 无法及时回收。
目前所知的比较安全的方案是:
- 在布局中动态添加 WebView。
- 采用下面的方法。
override fun onDestroy() {
webView?.apply {
val parent = parent
if (parent is ViewGroup) {
parent.removeView(this)
}
stopLoading()
// 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
settings.javaScriptEnabled = false
clearHistory()
removeAllViews()
destroy()
}
}
5. 循环引用
循环引用导致内存泄漏比较少见,正常来讲不会有人写出 A 持有 B,B 持有 C,C 又持有A 这样的代码,不过总还是需要注意。
总的来说,内存泄漏很常见,但检测方式也很多。我们的 Android Studio 自带的 Monitors 就可以帮我们找到大部分内存问题,当然我们也可以采用譬如 LeakCanary 这样的库去做检测。
每日一问:Android 中内存泄漏都有哪些注意点?的更多相关文章
- android性能测试内存泄漏
1.什么是内存泄漏? 适用于该系统的内存使用内存泄漏,未回复(释放),该内存可以没有事业,也不能被其他人使用使用自己. 2.出有什么差别? 内存泄漏是分配出去的内存无法回收. 内存 ...
- 利用Android Studio、MAT对Android进行内存泄漏检测
利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...
- [轉]Android的内存泄漏和调试
一. Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的 ...
- Android防止内存泄漏以及MAT的使用
Android发生内存泄漏最普遍的一种情况就是长期保持对Context,特别是Activity的引用,使得Activity无法被销毁.这也就意味着Activity中所有的成员变量也没办法销毁.本文仅介 ...
- android 常见内存泄漏原因及解决办法
android常见内存泄漏主要有以下几类: 一.Handler 引起的内存泄漏. 在Android开发中,我们经常会使用Handler来控制主线程UI程序的界面变化,使用非常简单方便,但是稍不注意,很 ...
- [原理] Android Native内存泄漏检测原理解析
转载请注明出处:https://www.cnblogs.com/zzcperf/articles/11615655.html 上一篇文章列举了不同版本Android OS内存泄漏的检测操作(传送门), ...
- C++中内存泄漏的检测方法介绍
C++中内存泄漏的检测方法介绍 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck, ...
- [转]Android中内存占用的含义:(VSS,PSS,RSS,USS)
Android中内存占用的含义:(VSS,PSS,RSS,USS) 作者: andforce 分类: 安卓系统 发布时间: 2013-09-07 00:03 ė1,915 浏览数 6没有评论 在eng ...
- Android开发常见的Activity中内存泄漏及解决办法
上一篇文章楼主提到由Context引发的内存泄漏,在这一篇文章里,我们来谈谈Android开发中常见的Activity内存泄漏及解决办法.本文将会以“为什么”“怎么解决”的方式来介绍这几种内存泄漏. ...
随机推荐
- 关于thinkphp3.2.3集成phpmailer
关于thinkphp3.2.3集成phpmailer 1 我用的是phpmailer5.1的版本 先把文件解压缩放到这个位置 2 封装到函数里面 function email($email,$tit ...
- Client 客户端AspNetCore.SignalR 通讯服务器 Quartz 执行任务
背景 需要Client跑服务在终端间隔执行任务,我的目标是运行在树莓派上 Client代码 如果未连接成功时隔3秒重新连接服务器 public static void Reconnect() { va ...
- MVC+Ninject+三层架构+代码生成 -- 总结(五、Ninject)
1.在寫邏輯層前,需要弄好反轉控制,因框架沒有寫接口,所以Ninject只負責返回當前實例,有點類似共享設計模式. public sealed class IOCHelper { private st ...
- 剑指offer 栈的压入和弹出
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- 一些质量极高的project-based tutorials
<let's build a simple xxx> build your own lisp ★ Crafting Interpreters (学生版)Implementing Funct ...
- 基于tensorflow训练模型的显存不足解决办法
import tensorflow as tfimport osos.environ["CUDA_VISIBLE_DEVICES"] = '0' #指定第一块GPU可用config ...
- 将MySQL升级到8.0.x后的遇到到错误及解决
一,安装的时遇到的坑 我下的是Mysql 8.0.13 地址:https://dev.mysql.com/downloads/mysql/ 下的是解压版(个人能不用安装就不想用安装版的强迫症(/▽\) ...
- QT在Mac OS上编译运行初体验
QT是一个跨平台的框架,支持PC端(Windows.Linux和Mac OS)以及移动端(Android和IOS),之前的开发大都在Windows或者Ubuntu上,考虑到项目多平台支持性,本文对Ma ...
- Qt json使用
JSON 6 种基本数据类型 QJsonValue::Bool QJsonValue::Double QJsonValue::String QJsonValue::Array QJsonValue:: ...
- Kubernetes概念之mater、node
很久没写博客了,终于把重心找回来了,不过没有以前有斗志.有理想.有目标了.慢慢来.你若问我我最近几年的规划是什么,还真不知道.突然发现摧毁一个人真的很简单.k8s也是一遍一遍的从入门到放弃,还是要好好 ...