引言

Android应用程序中内存使用的问题经常容易被忽视,在传统的编程语言中(例如C语言),回收内存的任务是由程序本身来完成的,程序可以显式分配和释放变量所占用的内存。Android[1]应用程序采用Java编程语言编写,而Java区别于其他语言的一个重要优点就是它通过垃圾收集器(Garbage Collection,GC) 自动管理内存的回收,Java程序员只需通过内存分配操作创建对象,而无须关心对象占用的空间是如何被收回的。因此很多程序员认为在Java中不必担心内存泄漏的问题,然而实际并非如此,Java中仍然存在着内存泄漏。Android应用程序运行在嵌入式系统中,而嵌入式系统中内存的总量非常有限,因此如何合理地规避“内存泄露”问题也就显得十分关键。

1 造成Android应用程序内存泄漏的原因

1.1 引用没释放造成的内存泄露

(1) 注册没有取消造成的内存泄漏

这种Android的内存泄露比纯Java的内存泄漏还要严重,因为其他一些Android程序可能引用系统的Android程序的对象(比如注册机制)。即使Android程序已经结束了,但是别的应用程序仍然还有对Android程序的某个对象的引用,泄漏的内存依然不能被垃圾回收。

(2) 集合中对象没有关闭造成的内存泄漏

通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,慢慢地这个集合就会越来越大。如果这个集合是静态的话,那情况就会更严重。

1.2 资源对象没有关闭造成的内存泄漏

资源对象比如Cursor、File文件等往往都用了一些缓冲,在不使用的时候应该及时关闭它们,以便它们的缓冲及时回收内存。这些缓冲不仅存在于Java虚拟机内,还存在于Java虚拟机外,如果仅仅是把它的引用设置为空,而不关闭它们,那么往往会造成内存泄漏。

一些不良代码造成的内存压力原因如下:

◆ Bitmap没有调用recycle( );

◆ 构造Adapter时,没有使用缓存的convertView;

◆ ThreadLocal使用不当;

◆ 其他。

2 内存泄漏的检测及定位

2.1 内存泄漏的检测

Android应用程序是基于虚拟机的,其内存管理都是由Dalvik[2]代为管理,GC的回收不是及时的。一个正常的应用程序在其运行稳定后其内存的占用量是基本稳定的,不应该是无限制的增长。同样,对任何一个类的对象的使用个数也有一个相对稳定的上限,不应该是持续增长的。当我们持续地观察某个应用程序运行过程中使用内存的大小和各实例的个数时,如果内存的大小持续增长,则说明系统存在内存泄漏的问题;如果特定类的实例对象个数随时间而增长,则说明这个类的实例可能存在泄漏情况。比如一个Activity被关掉之后,其内存的引用对象会在下次GC回收[3]的时候通过回收算法计算,如果这部分内存已经属于可回收的对象,那么这些垃圾对象会被一并回收,内存未泄漏趋势图如图1所示。

图1 内存未泄漏趋势图

内存泄漏趋势图如图2所示。在重复打开关闭某个应用程序的时候,内存一直在向上爬升,也就是说每次关闭这个Activity的时候,有些应该释放的内存并没有被释放掉。由此我们可以确定这个应用程序存在着内存泄漏的问题。

图2 内存泄漏趋势图

android对象引用释放,Android程序的内存泄漏与规避方法相关推荐

  1. Android性能优化(2):常见内存泄漏与优化(二)

    文章目录 1. Android虚拟机:Dalvik和ART 1.1 JVM与Dalvik区别 1.2 Dalvik与ART区别 1.3 Dalvik/ART的启动流程 2. 常见内存分析工具 2.1 ...

  2. 5 个 Android 开发中比较常见的内存泄漏问题及解决办法

    Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再 ...

  3. 解决Solaris应用程序开发内存泄漏问题

    作者: 李凌云,张一峰(laoeyu) 内存泄漏是应用软件开发过程中经常会遇到的问题,应用长期内存泄漏会占用大量操作系统内存资源,直接导致应用程序运行不稳定,严重时甚至还会影响到操作系统的正常运行.为 ...

  4. 解决Solaris应用程序开发内存泄漏问题 (1)

    作者: 李凌云,张一峰(laoeyu) 概述 内存泄漏是应用软件开发过程中经常会遇到的问题,应用长期内存泄漏会占用大量操作系统内存资源,直接导致应用程序运行不稳定,严重时甚至还会影响到操作系统的正常运 ...

  5. VS C/C++控制台程序添加内存泄漏自动检测功能

    基于MFC框架的应用程序由模板生成时,已经自动添加了内存泄漏自动检测功能,当你的程序有内存泄漏,在Debug调式模式下运行就会在vc的输出窗口里显示出来,容易发现并及时解决.但是我们在写一些测试程序时 ...

  6. Android APP常见的5类内存泄露及解决方法

    Android APP常见的5类内存泄露及解决方法 参考文章: (1)Android APP常见的5类内存泄露及解决方法 (2)https://www.cnblogs.com/genggeng/p/7 ...

  7. Golang程序调试 -- 内存泄漏pprof工具

    Golang程序调试 -- 内存泄漏pprof工具 代码引入pprof WEB访问模式 命令行模式定位内存 命令行模式定位耗时 命令行模式定位内存分配 代码引入pprof import (" ...

  8. C# Winform应用程序占用内存较大解决方法整理(转)-- SetProcessWorkingSetSize

    一.C# Winform应用程序占用内存较大解决方法整理(转) 原文:  http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在 ...

  9. linux内存泄漏通用排查方法

    一.   概述 Linux下经常遇到内存泄漏的问题,尤其对C/C++开发人员来说是一个亘古不变的话题,现在介绍解决Linux内存泄漏问题的方法层出不穷,让人眼花缭乱,但是作为开发人员应该从本质上了解为 ...

  10. C++中内存泄漏的检测方法介绍

    本文介绍C++中内存泄漏的检测方法. 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsChe ...

最新文章

  1. 英特尔CEO:英特尔下一个市场将是无人驾驶汽车
  2. 编程正式进入中考模式!北京海淀:通过信息技术考试方可毕业
  3. git常用命令(二)
  4. html日期写入数据库,javascript – 在HTML5 Web SQL数据库中对日期时间进行排序
  5. PHP Ajax 跨域问题最佳解决方案
  6. OSI七层模型的作用
  7. 使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分
  8. HIVE 数据倾斜浅谈
  9. 基于jQuery实现自动或点击切换效果
  10. mysql 两个数相加_LeetCode 01两数之和02两数相加
  11. 【转】vb获得网络时间的函数
  12. java 减少内存_java-减少应用程序内存占用
  13. JDBC连接错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。。。
  14. Redis 6.0 源码阅读笔记(7) -- ZSet 数据类型源码分析
  15. Theano学习二:内存、变量、函数、自动微分、循环、scan以及分析调试等基础知识
  16. 《R数据科学》学习笔记|Note2:使用ggplot2进行数据可视化(上)
  17. 首届“中科杯”全国软件设计大赛获奖名单揭晓
  18. AMD发布22.9.2驱动,支持《禁闭求生(Grounded)》
  19. ps裁剪和裁切的区别_ps裁剪工具怎么用?调整图像与画布的尺寸(三)
  20. zedboard 驱动理解

热门文章

  1. C/C++回调方式系列之一 函数指针和函数回调模式
  2. AGC020C Median Sum
  3. webpack5学习与实战-(九)-区分开发和生产环境的配置
  4. 前端性能优化(慕课网笔记)-2-渲染优化(浏览器)
  5. gdisk 创建和维护磁盘分区命令(GPT分区方案)
  6. python 镜像_python测开平台使用dockerfile构建镜像
  7. python3实用编程技巧_Python3实用编程技巧进阶一
  8. 雾霾图像matlab,MATLAB图像处理:一分钟去除图片中的雾霾
  9. 利用hashmap的java_利用Java如何实现对HashMap的集合使用
  10. php 构造函数参数传值,php 构造函数参数