Android内存泄露

2023-10-30

Android内存泄露概述

  了解Android内存泄露之前,需要对java的内存管理和GC机制有个简单的了解。
  Android内存泄露的根本原因是引用者的生命周期大于被引用者。举个例子,有对象A,B,B有A的强引用,GC要回收A时发现B还未销毁,所以A也未能被回收。

Android的内存泄露后果

  1. 直接后果是,内存泄露导致空间浪费,最终导致内存溢出;
  2. 间接后果是,内存不足导致频繁GC,系统性能下降

Android内存泄露场景

  1. 单例模式中引用四大组建,最常见的是单例中引用Activity的context,导致该Activity在内存中存活的周期和Application一样长,GC无法正常回收。
      解决办法:单例模式应用ApplicationContext,该引用和应用的生命周期一样长
  2. 非静态内部类或匿名内部类,该类对象持有外部类的强引用,如果该类的对象进行耗时操作,无法短期内被回收,那他持有的外部对象也无法及时回收,典型场景有:匿名Thread类异步执行耗时操作,非静态Handler对象,其中有未完成的异步信息。
      解决办法:内部类如果任务繁重,可以考虑使用静态内部类,静态内部类独立于外部类存在,典型的应用场景如RecyclerView中的VIewHolder。
  3. 集合中存储静态对象,导致集合占用的空间无法及时释放。
      解决办法:。。。
  4. 资源没有关闭,例如文件操作、网络流、广播未注销、Service脱离Activity未停止运行、观察者模式未解除监听等等。
      解决办法:养成良好的编程习惯,成对出现的open,close要一起使用。

补充学习一下java的各种引用

  1. 强引用:最通用的引用,比如 B b = new B(),b就是一个强引用,这样该引用存在,GC就不会回收,这也是导致java内存泄露的根本原因;
  2. 软引用:当内存不够时,GC会先回收这类引用;SoftReference bs = SoftReference(b);
  3. 弱引用:当GC发现一个对象只有弱引用时,马上回收它,WeakReference sr = new WeakReference(b);
  4. 虚引用:类似于占位符,不影响实际对象的生命周期,GC该怎么做就怎么做。
      综上,是java提供的几种引用机制,如果我们加以利用,可以一定程度上减少内存泄露情景,具体用法网上很多,我也正在学习当中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android内存泄露 的相关文章

随机推荐

  • 批量生成固定格式的图片,写上不同的文字

    批量生成下面这种标签 图片 红色圈起的位置和二维码要根据excel的数据动态变化 二维码扫出来是订单编号 思路 1 xlrd库读取excel数据 2 用MyQR库生成订单号的二维码 3 pillow库生成适当大小的空白底图 先是把二维码图片
  • H5 DOM 全屏 api requestFullscreen

    文章转载自 http javascript ruanyifeng com htmlapi fullscreen html toc7 js 设置 退出和判断全屏的方法 设置全屏 退出全屏 全屏属性 全屏事件 全屏状态的CSS 设置全屏 req
  • 操作系统基础-多线程处理浅析

    对于一个大型的复杂项目 或者多人协作的项目 如何处理同时运行的线程 如何在线程之间传递消息 处理同步是首要问题 经历过C 技术面的同学应该深有体会 在面试中 多线程 观察者模式 数据总线 事件总线都是经常被问到的重灾区 最近在工作中遇到的此
  • Python 多线程-共享全局变量问题

    多线程 共享全局变量问题 多线程可能遇到的问题 假设有两个线程t1和t2 都要对一个变量g num进行运算 1 两个线程t1和t2分别对g num各加10次 g num的最终结果 import threading import time g
  • 定向越野(添加任务信息和根据坐标位置触发游戏)

    1 首先获取任务地点的实际坐标值 用hashmap存储 HashMap
  • matlab里的随机数函数,MATLAB中常用的产生随机数的几种函数

    1 rand函数 rand函数用于产生在区间 0 1 的均匀随机数 它是平均分布在 0 1 之间 一个称为seed的值则是用来控制产生随机数的次数 均匀随机数函数的语法为rand n rand m n 其结果分别产生一矩阵含n n个随机数和
  • uniapp之最新获取用户昵称以及头像

    目录 前言 一 只展示不传递给后端 二 方法二 前言 在uniapp登录时候最开始想的就是手机号登录之后 就获取用户的昵称以及头像 存储起来 登录的时候直接显示在我的页面 最开始使用的是 uniapp官网自带的uni getUserProf
  • C语言简易学生管理系统(含源码)

    项目部分截图 以下是完整源代码 cpp文件 include StudentManagerSystem h int main 改变控制台字体颜色 SetConsoleTextAttribute GetStdHandle STD OUTPUT
  • java 力扣 88题 合并两个有序数组

    class Solution public void merge int nums1 int m int nums2 int n List
  • SpringBoot定时任务注解@Scheduled中fixedRate和fixedDelay

    Scheduled fixedRate 2000 public void myJob1 System out println LocalDateTime now 定时任务O O 休眠模拟代码块运行的时间 try TimeUnit SECON
  • 电路的等效变换(二)

    文章目录 一 电路的等效变换 等效有什么作用 等效变换的特点 二 电阻的串联和并联 三 电压源 电流源的串联和并联 电压源与支路的串 并联等效 理想电流源的串联和并联 电流源与支路的串 并联等效 四 实际电源的两种模型及其等效变换 之前的K
  • 如何把访问局域网时保存的密码给清除?

    问 一次在局域网中访问其他电脑时 弹出窗口需要我输入用户名和密码 结果我选择了 保存密码 项 以后每次访问那台电脑时都不需要输入密码了 这台电脑马上将会让给其他人用了 我现在想清除先前保存的那个密码 不知如何操作 答 要想清除保存的密码可以
  • 基于matlab的车牌定位算法设计与实现,原创】基于matlab的汽车牌照识别系统设计与实现...

    原创 基于matlab的汽车牌照识别系统设计与实现 由会员分享 可在线阅读 更多相关 原创 基于matlab的汽车牌照识别系统设计与实现 14页珍藏版 请在人人文库网上搜索 1 基于matlab的汽车牌照识别系统设计与实现摘要 本次作业的任
  • keil如何下载STM32芯片F1/F4固件库

    1 用keil打开STM32F407的程序 结果提示下面的问题 就是没有安装固件库 2 然后去keil官网下载对应的固件库 官网地址 https www keil com 然后选中对应的芯片类型 譬如我这个就是STM32F407IGTx 安
  • HttpServletResponse response实现文件上传、下载

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经700 订阅 CSDN最
  • 2023年三季度中国经济观察

    导读 2023年上半年中国经济同比增长5 5 其中二季度同比增速为6 3 受去年同期低基数影响 较一季度提高1 8个百分点 从环比来看 二季度GDP环比增速为 0 8 较一季度的2 2 明显回落 国内经济修复动能有所放缓 总体来看 随着中国
  • 在vscode中使用Live Server 真机调试

    第一步 安装Live Server 1 在vscode 中搜索 Live Server并安装 2 安装完成之后 鼠标右键单击 html文件 gt 点击 Open with Live Server 3 然后会弹出默认浏览器 并显示页面 可以看
  • vscode如何去除终端启动时显示的多余信息(win11)

    参考链接 https zhuanlan zhihu com p 109788300 在win10中我按照上述链接中的方法操作 成功移除了终端启动时显示的多余信息 现在电脑更新到win11后又出现了如下所示的广告信息 安装最新的 PowerS
  • 2023年最火副业;python爬虫兼职,一周赚7800元,一天只要两小时 !

    前言 大家好 现在学习python的人越来越多了 跟大家简单如何利用python搞副业赚钱的 想要利用 Python 赚钱的方式还是比较多的 其中接单和投稿算是两种比较简单的方式了 如果你是业余学python爬虫 可以去淘宝上加了找了几个店
  • Android内存泄露

    Android内存泄露概述 了解Android内存泄露之前 需要对java的内存管理和GC机制有个简单的了解 Android内存泄露的根本原因是引用者的生命周期大于被引用者 举个例子 有对象A B B有A的强引用 GC要回收A时发现B还未销