内存泄漏:内存单元使用完成后未释放,未回收。

理解强弱引用和gc垃圾回收机制后,会更好的理解内存泄漏问题。

在目前的Android项目中,内存泄漏是无法避免的,在编写代码时要是否产生了内存泄漏。内存泄露中要注意对象、变量等的回收时刻。

在内存泄露中,虽然存在gc回收机制,还是要搞明白,你声明的东西是何时创建的,何时回收的。简单来说,就是要知晓生命周期,了解越多这样的知识,对你的代码理解力就会有越多的提升。

一.static引发的内存泄漏:

在单例模式下,我们通常都会使用static修饰我们的对象,所以这里就要讲一下static所修饰的内容的生命周期了。

static:强调一下static修饰的内容通常是不会被gc系统回收的,所以该内容就会一直存在在系统中,那么,static总是会有销毁的时候吧:

Lifetime of a static variable: A static variable comes into existence when a class is loaded by the JVM and dies when the class is unloaded,if you create an android application and initialize a static variable, it will remain in the JVM until one of the following happens:

the class is unloaded

the JVM shuts down

the process dies

1.类被卸载的时刻。

2.JVM虚拟机关机的时刻。

3.进程被kill的时刻。

那么也就说static所修饰的内容和程序的生命周期是相关的。

接下来要说的东西就很好理解了:

1.单例模式的内存泄漏

一些单例模式中初始化时会传入context;当你传入Activity/Fragment的contenxt时;在该Activity/Fragment关闭,要被回收的时候,单例类还是会持有对Activity/Fragment的context引用,那么该Activity/Fragment就不会被回收,这样就造成了内存的泄漏。所以最好的解决办法是 传入Application的context即可,Application就是程序,他的context就是程序的context,所以与static的生命周期相同。例:getApplicationContext()。

2.非静态内部类创建静态实例造成的内存泄漏

内部类的最好优势就是默认会持有外部类的引用,而当你用这个非静态内部类创建了一个静态实例,那么麻烦来了,因为这个类并非静态类,所以这个类是可以被回收的,但是静态实例一值保持着对该非静态类的引用,造成了非静态内部类不能被回收,因为非静态内部类是不能脱离所属类而单独存活的,那么也就导致了外部类不能被回收,内存泄漏就产生了。解决办法当然是加上static,将非静态内部类变成静态内部类,静态内部类不依赖外部类,他们拥有不同的生命周期。

1).单例模式的静态内部类,这种写法的单例模式是最推荐使用的单例模式(详细可查看《Android源码设计模式解析与实战》)。

public class AppContext {

public static AppContext getInstance() {

return SingletonHolder.instance;

}

/**

* 静态内部类的单例模式

*/

private static class SingletonHolder{

private static final AppContext instance = new AppContext();

}

}

复制代码2).线程中的的内存泄漏

也可以归到内部类的静态使用。

线程的方式有Handler、AsyncTask、Thread等方式。

其中所有的线程方式在Activity中都是内部类的方式存在的,所以一般为了避免内存泄漏,都将这些线程实行静态内部类的方法。在Activity被销毁的时候,将线程关闭,清空线程中的任务。

所以一定要慎用static,在使用时要考虑到是否产生了内存泄漏。

二、资源未关闭产生的内存泄漏

这个就简单了,在使用BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等后,要记得对资源进行手动回收,就避免了内存泄露。

有不对的地方欢迎大家指出来!

谢谢!!!

android性能优化 掘金,Android性能优化之内存泄漏相关推荐

  1. 【转】android如何查看cpu的占用率和内存泄漏

    原文网址:http://www.cnblogs.com/yejiurui/p/3472765.html 在分析内存优化的过程中,其中一个最重要的是我们如何查看cpu的占用率和内存的占用率呢,这在一定程 ...

  2. 4大JVM性能分析工具详解,及内存泄漏分析方案

    谈到性能优化分析一般会涉及到: Java代码层面的,典型的循环嵌套等 还会涉及到Java JVM:内存泄漏溢出等 MySQL数据库优化:分库分表.慢查询.长事务的优化等 阿里P8架构师谈:MySQL慢 ...

  3. android如何查看cpu的占用率和内存泄漏

    在分析内存优化的过程中,其中一个最重要的是我们如何查看cpu的占用率和内存的占用率呢,这在一定程度上很重要,经过查询资料,研究了一下,暂时了解到大概有以下几种方式,如果哪位高手有更好的办法,或者文中描 ...

  4. Android开发笔记(七十五)内存泄漏的处理

    内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏.C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区 ...

  5. Android内存优化(三)避免可控的内存泄漏

    相关文章 Android性能优化系列 Java虚拟机系列 前言 内存泄漏向来都是内存优化的重点,它如同幽灵一般存于我们的应用当中,有时它不会现身,但一旦现身就会让你头疼不已.因此,如何避免.发现和解决 ...

  6. Android 内存泄漏问题多多,怎么优化?

    作者 | 无名之辈FTER 来源 | CSDN博客 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 众所周知,Java因其拥有独特的虚拟机(JVM)设计,使其成为一门跨平台.内存自动管理 ...

  7. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

    文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...

  8. Android 内存泄漏检测开源库LeakCanary 研究

    1. Android 内存空间不足会引发的问题 1.1 异常 1.2 卡顿 1.3 从 Java 堆内存超限这个问题开始 2. 内存优化着手点 2.1 检测 RAM usage 2.2 进程 2.3 ...

  9. Android常见内存泄漏

    1.什么是内存泄露 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃(内存溢出OOM)等严重后果. 内存 ...

最新文章

  1. 推荐个所见即所得的编辑器
  2. MySQL binlog
  3. 工程师必知的代码重构指南
  4. nssl1454-最短路【并查集,贪心】
  5. java设计模式之装饰模式_Java中的装饰器设计模式
  6. Linux disk 100% busy,谁造成的?
  7. 使用C#创建Windows服务 并发布Windows 服务
  8. 基础Git操作与GitHub协作吐血整理,收好!| 原力计划
  9. linux PE制作ramdisk,PE怎样在中建立一个Ramdisk盘
  10. JDK 8 最后一个免费版本 下载
  11. TLE 生成 Cesium CZML 卫星轨道数据
  12. 英语精选流行口语+疯狂英语100句
  13. 【高德地图进阶】--- 带图片的点(3)
  14. 国内技术管理人员批阅google的“春运交通图”项目
  15. JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法
  16. java PKCS12 证书生成
  17. WMS仓储自动化是什么?有哪些用途
  18. 【转】SAP物料主档关键栏位
  19. 四川华巨同诚:拼多多如何修改类目信息
  20. PCR实验室应该怎样布置呢?

热门文章

  1. java.net.SocketException: 权限不够
  2. oracle数据库字符编码utf-8改为ZHS16GBK
  3. window下远程监控linux下tomcat的jvm
  4. vue切换css样式
  5. MySQL工具名字_MySQL客户端工具及SQL讲解
  6. c语言写贪吃蛇什么水平_关于C语言写贪吃蛇
  7. 结构损伤检测与智能诊断 陈长征_宿迁厂房安全检测多少钱介绍说明
  8. linux tunl0 ip,Centos7下lvs负载均衡lvs-tun模式配置
  9. java 迭代器的原理_java里Iterator的原理
  10. linux qtcreator输入中文,新版QT creator下解决fcitx无法输入中文问题(QTcreatorV4.1.0)...