【性能优化】Android中比较常见的内存泄露

1.单例

单例所导致的内存泄漏几乎是在android开发中最为常见的内存泄漏问题了。

public class Singleton {
private static Singleton singleton;
private Context context;
private Singleton(Context context) {
this.context = context;
}
public static Singleton getInstance(Context context) {
if (singleton == null) {
singleton = new Singleton(context);
}
return singleton;
}
}

在上面的代码中,如果在执行 getInstance 方法的时候,传入的是activity的对象,那么该activity对象就没法被及时回收,导致内存泄漏,可以考虑传入ApplicationContext,或者把context放入到方法变量中。

2.非静态内部类(包括匿名内部类)

非静态内部类会默认持有外部类的引用,如果它的生命周期长于外部类时,就会导致内存泄漏。 在android开发,这种情况常常见于Handler的使用。

  • 尽可能避免使用静态变量
class MainActivity : AppCompatActivity() {
companion object {
@JvmStatic
private var info: StaticInfo? = null
}
override fun onCreate(savedInstanceState: Bundle?) {
info = StaticInfo(this)
}
class StaticInfo(activity: MainActivity) {
}

在上述代码中, info 是一个静态变量,但是它持有了 activity 的引用,由于静态变量的生命周期要比 activity的生命周期长,导致 activity 无法及时回收,造成内存泄漏。

  • 资源未关闭造成的内存泄漏

诸如cursor、inputStream等对象一定要注意及时关闭

try {
}catch (e:Exception) {
}finally {
// 可以在finally方法里把cursor等对象进行关闭
}
  • 集合中的对象未及时清理造成的内存泄漏
val list = ArrayList<Activity>()

例如,如果一个list中存放的是activity对象,就会可能导致activity无法及时回收。如果该list是静态对象的话,不及
时移除activity的话,就更会产生内存泄漏了。

  • webview造成的内存泄漏

因为webview在加载完网页后,它的callback会持有activity的引用,造成webview的内存无法释放。可以在activity的onDestroy()方法中移除该webview,并调用webview.destroy()。

  • 未取消注册或回调造成的内存泄漏

在android中回调是使用非常多的,但如果在注册回调的时候,传入了context对象,则需要注 意及时取消回调,否则就可能会出现内存泄漏。例如eventbus和广播。

文末

这里给大家分享一份《Android性能优化-大厂实战全解析》,这份《Android性能优化-大厂实战全解析包括有:腾讯、字节、阿里、百度、网易、美团等一线互联网大厂的优化实战解析,更是附赠360°性能调优学习指南有需要的朋友们也可以下载下来随时查漏补缺扫码直接领取哟

图片

《‍Android性能优化-大厂实战全解析》目录及内容展示

腾讯团队

  • 腾讯光影研究室—Android P之Smart Linkify
  • 腾讯微信—Matrix原理分析系列之开篇
  • 腾讯微信—Mareix源码系列之如何解析应用安装包
  • 腾讯微信—Mareix源码系列之如何监控帧率变化
  • 腾讯Bugly—动态下发 so 库在 Android APK 安装包瘦身方面的应用
  • QQ音乐—彻底弄懂浏览器缓存策略
  • QQ音乐Android编译提速之路
  • 全民k歌适配arm64-v8a方案
  • 全民K歌内存篇1——线上监控与综合治理
  • 全民K歌内存篇2——虚拟内存浅析
  • 全民K歌内存篇3——native内存分析与监控
  • 腾讯Bugly—对字符串匹配算法的一点理解

图片

字节团队

  • 字节跳动技术团队— 深入理解Gradle框架之一:Plugin,Extension, buildSrc

  • 字节跳动技术团队—深入理解gradle框架之二:依赖实现分析

  • 字节跳动技术团队—Scene:Android 开源页面导航和组合框架

  • 字节跳动技术团队—AwCookieManager.nativeGetCookiecrash 排查

  • 字节跳动技术团队—另类 BadTokenException 问题分析和解决

  • 字节跳动技术团队—抖音包大小优化-资源优化

  • 字节跳动技术团队—二维码扫描优化

  • 字节跳动—Android Camera内存问题剖析

  • 抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%

  • 抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%(二)

  • 抖音 Android 性能优化系列:Java 内存优化篇

  • 今日头条 Android ‘秒’ 级编译速度优化

图片

阿里团队

  • 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」

  • 支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能

  • 支付宝 App 构建优化解析:Android 包大小极致压缩

  • 解决支付宝包体积优化的遗留问题:运行时获取dexpc

  • 闲鱼技术—曾梦想 if-else 走天涯?看看“责任树模式”优化

  • 闲鱼如何在2个月内实现Android启动速度翻倍的?

  • 高德技术—Android Native 内存泄漏系统化解决方案

  • 天猫精灵技术—史上最全Android渲染机制讲解(长文源码深度剖析)

图片

百度团队

  • 百度APP-Android H5首屏优化实践

  • 百度App技术—一种简单优雅的TextView行间距适配方案

  • 百度App技术—Android 10分区存储介绍及百度APP适配实践

  • 百度App技术—Gradle 与 Android 构建入门

  • 百度App组件化之路

  • 百度App网络深度优化系列《三》弱网优化

图片

网易团队

  • 网易新闻客户端 H5 秒开优化

  • 网易新闻构建优化:如何让你的构建速度“势如闪电”

  • 网易传媒技术团队—AOP技术在客户端的应用与实践

  • 网易大数据|互联网产品决策秘笈: AB测试

图片

美团团队

  • 美团技术团队—Android静态代码扫描效率优化与实践

  • 美团技术团队—Probe:Android线上OOM问题定位组件

  • 美团技术团队—移动端UI一致性解决方案

  • 美团—设计稿(UI视图)自动生成代码方案的探索

  • ……

  • ……

图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于性能优化Android开发可以考虑以下几个方面: 1. 减少内存占用:确保在应用使用的资源和对象被及时释放,避免内存泄漏。可以使用虚拟机提供的工具进行内存分析,如Android Profiler或MAT(Memory Analyzer Tool)。 2. 减少网络请求:减少网络请求的次数,尽量将多个请求合并为一个,或使用缓存来减少网络传输。 3. 使用异步操作:将耗时操作放在后台线程上执行,避免阻塞主线程。可以使用AsyncTask、Thread或Kotlin协程等机制来实现异步操作。 4. 优化布局和绘制:避免过度绘制,减少不必要的布局层次。可以使用视图优化工具,如Hierarchy Viewer来分析布局层次和绘制性能。 5. 图像和动画优化:对于图片资源,可以使用适当的压缩算法来减小文件大小。对于动画,可以使用硬件加速来提高性能。 6. 数据库和存储优化:合理使用数据库操作,如批量插入、事务操作等。对于大量数据的存储,可以考虑使用SQLite数据库或其他合适的存储方式。 7. 代码优化:避免不必要的循环、条件判断等。使用性能更好的数据结构和算法。及时释放资源,避免频繁的对象创建和销毁。 8. 使用优化工具:Android提供了一些性能优化的工具,如ProGuard(代码压缩与混淆工具)、Lint(代码质量检查工具)等,可以使用这些工具来帮助优化应用性能。 总之,性能优化是一个综合考虑多方面因素的过程,需要根据具体的应用场景和需求进行分析和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值