先来想这三个问题

  1. 内存泄露是怎么回事
  2. 内存会泄露的原因
  3. 避免内存泄露

1.内存泄露怎么回事

一个程序中,已经不须要使用某个对象,可是由于仍然有引用指向它垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。
Android的一个应用程序的内存泄露对别的应用程序影响不大。
为了可以使得Android应用程序安全且高速的执行,Android的每一个应用程序都会使用一个专有的Dalvik虚拟机实例来执行,它是由Zygote服务进程孵化出来的。也就是说每一个应用程序都是在属于自己的进程中执行的。
Android为不同类型的进程分配了不同的内存使用上限,假设程序在执行过程中出现了内存泄漏的而造成应用进程使用的内存超过了
这个上限,则会被系统视为内存溢出。从而被kill掉,这使得只自己的进程被kill掉,而不会影响其它进程(假设是system_process等系统进程出问题的话,则会引起系统重新启动)

2.出现内存泄露原因

1.资源对象没关闭造成的内存泄露
资源性对象比方(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们。以便它们的缓冲及时回收内存
2.变量的作用域不一样导致
变量 作用域
函数变量 函数内
成员变量 整个对象内
TLS(ThreadLocalStorage) 整个线程
静态变量 整个进场内
Binder(IPC) 进程间 由于作用域的不同。作用域大引用到对象都可能不会立即销毁,所以会内存泄露。 handle 的内存泄露主要 TLS变量和 activity的生命周期不一样,。 Thread 引用其它对象也easy出现对象泄露。 3.内存压力过大
1.图片资源载入过多,超过内存使用空间,比如Bitmap 的使用
2.反复创建view,没有反复使用 listview,的使用

3.怎样避免内存泄露

1.良好的代码规范,清晰代码逻辑
2.对于引用生命不一样的对象。能够用弱引用WeakReferner
3.对于资源对象 使用finally 强制关闭
4.内存压力过大就要统一的管理内存
5.对象反复而且频繁调用能够考虑对象池。

Android内存泄露之开篇的更多相关文章

  1. (转)专项:Android 内存泄露实践分析

    今天看到一篇关于Android 内存泄露实践分析的文章,感觉不错,讲的还算详细,mark到这里. 原文发表于:Testerhome: 作者:ycwdaaaa ;  原文链接:https://teste ...

  2. Android内存泄露

    Android 内存泄漏是一个十分头疼的事情.LeakCanary是一款开源软件,主要作用是检测 Android APP 内存泄露.比起以前的 MAT 工具,LeakCanary 有着十分强大的功能, ...

  3. android内存泄露调试,Heap,MAT

    三.内存监测工具 DDMS --> Heap 无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中 ...

  4. Android内存泄露测试

    Android性能测试过程中的一些常用命令: CPU: adb shell top -n | grep "+PackageName 内存: adb shell dumpsys meminfo ...

  5. android内存泄露小谈

    在做android的时候,用的语言大部分情况下都是java.以前最开始做的是编译器开发, 大部分情况都是用c语言和x86与arm架构的汇编,后来接触到ios用的是OC.对比之下, 感觉还是java用起 ...

  6. android 内存泄露之jni local reference table overflow (max=512)

    在android项目中要实现一个需求 为了性能的要求只能用c代码来实现功能. 这样就牺牲了java跨平台性. 通过加载.so的方式,把用c实现的模块集成到app中. android提供jni层,作为一 ...

  7. Android内存泄露---检测工具篇

    内存使用是程序开发无法回避的一个问题.如果我们毫不在意肆意使用,总有一天会为此还账,且痛不欲生...所以应当防患于未然,把内存使用细化到平时的每一行代码中. 内存使用概念较大,本篇先讲对已有app如何 ...

  8. Android内存泄露的原因

    (一)释放对象的引用,误将一个本来生命周期短的对象存放到一个生命周期相对较长的对象中,也称“对象游离“.隐蔽的内部类(Anonymous Inner Class): mHandler = new Ha ...

  9. JVM内存管理概述与android内存泄露分析

    一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...

随机推荐

  1. 重装macOS环境配置笔记

    由于早些年买mac的时候写代码的经验还不够,导致多年使用后mac上装满了乱七八糟的软件,比如python就有系统自带的,xcode里的,pyenv的,以及brew安装的各种版本,nginx,Apach ...

  2. C++ 继承/派生、访问属性、构造函数

    1.子类继承父类的继承方式:public,private,protected,不写则默认为private: 2.子类会继承父类的全部成员(除了构造函数.析构函数,虽然析构函数有virtual,但是不是 ...

  3. 数据层优化-jdbc连接池简述、druid简介

    终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...

  4. CAD实现批量打印(网页版)

    主要用到函数说明: IMxDrawPrint::BatchPrintDialog 批量打印对话框,详细说明如下: 参数 说明 [in] IMxDrawResbuf* pParam 批量打印位置参数, ...

  5. CAD绘制固定圆形云线标注(网页吧)

    js中实现代码说明: function DoCloudCircleCommentFix() { var comment = mxOcx.NewEntity("IMxDrawComment&q ...

  6. make、makefile

    http://blog.csdn.net/wed110/article/details/34853475 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows ...

  7. java线程池,信号量使用demo

    直接上代码 package org.jimmy.threadtest20181121; import java.util.concurrent.LinkedBlockingQueue; import ...

  8. 数据库中的Schema是什么?

    在数据库中,schema(发音 “skee-muh” 或者“skee-mah”,中文叫模式)是数据库的组织和结构,schemas andschemata都可以作为复数形式.模式中包含了schema对象 ...

  9. js文字内容部分选中的代码封装

    var textSelect = function(o, a, b){ //o是当前对象,例如文本域对象 //a是起始位置,b是终点位置 var a = parseInt(a, 10), b = pa ...

  10. 树莓派 - 驱动hello

    树莓派上Linux驱动,从hello world 开始 ... hello.c #include <linux/init.h> #include <linux/module.h> ...