android性能优化 掘金,Android性能优化之内存泄漏
内存泄漏:内存单元使用完成后未释放,未回收。
理解强弱引用和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性能优化之内存泄漏相关推荐
- 【转】android如何查看cpu的占用率和内存泄漏
原文网址:http://www.cnblogs.com/yejiurui/p/3472765.html 在分析内存优化的过程中,其中一个最重要的是我们如何查看cpu的占用率和内存的占用率呢,这在一定程 ...
- 4大JVM性能分析工具详解,及内存泄漏分析方案
谈到性能优化分析一般会涉及到: Java代码层面的,典型的循环嵌套等 还会涉及到Java JVM:内存泄漏溢出等 MySQL数据库优化:分库分表.慢查询.长事务的优化等 阿里P8架构师谈:MySQL慢 ...
- android如何查看cpu的占用率和内存泄漏
在分析内存优化的过程中,其中一个最重要的是我们如何查看cpu的占用率和内存的占用率呢,这在一定程度上很重要,经过查询资料,研究了一下,暂时了解到大概有以下几种方式,如果哪位高手有更好的办法,或者文中描 ...
- Android开发笔记(七十五)内存泄漏的处理
内存泄漏的原因 一直以来以为只有C/C++才存在内存泄漏的问题,没想到拥有内存回收机制的Java也可能出现内存泄漏.C/C++存在指针的概念,程序中需要使用指针变量时,就从内存中开辟一块区域,并把该区 ...
- Android内存优化(三)避免可控的内存泄漏
相关文章 Android性能优化系列 Java虚拟机系列 前言 内存泄漏向来都是内存优化的重点,它如同幽灵一般存于我们的应用当中,有时它不会现身,但一旦现身就会让你头疼不已.因此,如何避免.发现和解决 ...
- Android 内存泄漏问题多多,怎么优化?
作者 | 无名之辈FTER 来源 | CSDN博客 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 众所周知,Java因其拥有独特的虚拟机(JVM)设计,使其成为一门跨平台.内存自动管理 ...
- 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...
- Android 内存泄漏检测开源库LeakCanary 研究
1. Android 内存空间不足会引发的问题 1.1 异常 1.2 卡顿 1.3 从 Java 堆内存超限这个问题开始 2. 内存优化着手点 2.1 检测 RAM usage 2.2 进程 2.3 ...
- Android常见内存泄漏
1.什么是内存泄露 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃(内存溢出OOM)等严重后果. 内存 ...
最新文章
- 推荐个所见即所得的编辑器
- MySQL binlog
- 工程师必知的代码重构指南
- nssl1454-最短路【并查集,贪心】
- java设计模式之装饰模式_Java中的装饰器设计模式
- Linux disk 100% busy,谁造成的?
- 使用C#创建Windows服务 并发布Windows 服务
- 基础Git操作与GitHub协作吐血整理,收好!| 原力计划
- linux PE制作ramdisk,PE怎样在中建立一个Ramdisk盘
- JDK 8 最后一个免费版本 下载
- TLE 生成 Cesium CZML 卫星轨道数据
- 英语精选流行口语+疯狂英语100句
- 【高德地图进阶】--- 带图片的点(3)
- 国内技术管理人员批阅google的“春运交通图”项目
- JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法
- java PKCS12 证书生成
- WMS仓储自动化是什么?有哪些用途
- 【转】SAP物料主档关键栏位
- 四川华巨同诚:拼多多如何修改类目信息
- PCR实验室应该怎样布置呢?
热门文章
- java.net.SocketException: 权限不够
- oracle数据库字符编码utf-8改为ZHS16GBK
- window下远程监控linux下tomcat的jvm
- vue切换css样式
- MySQL工具名字_MySQL客户端工具及SQL讲解
- c语言写贪吃蛇什么水平_关于C语言写贪吃蛇
- 结构损伤检测与智能诊断 陈长征_宿迁厂房安全检测多少钱介绍说明
- linux tunl0 ip,Centos7下lvs负载均衡lvs-tun模式配置
- java 迭代器的原理_java里Iterator的原理
- linux qtcreator输入中文,新版QT creator下解决fcitx无法输入中文问题(QTcreatorV4.1.0)...