android内存泄露相关研究【整体看】

在android项目开发的时候,内存问题一直都是很困扰我们的常见的问题,在实际开发中,如何在开发时就很好的约束&控制内存已经成为了一件恨重要的事情了。

1.为什么要在开发时就要约束内存

因为小编从事过不同类型的APP的开发,混合式语言开发是我们现在开发中使用最常见的一种,在不同的脚本语言的时候,我们的内存产生也会不一样。

列子:下面小编就拿1)非常原生的App2)hybrid web App3)lua脚本语言APP

备注:因为本人电脑问题,不能够添加图片,具体证明类图片会在后期闲置的时间添加

结果:在这三种情况下的布局产生的内存不一样,也有很多ce回说是因为他们的一些框架原理不一样导致的,确实,lua脚本是使用的反射,hybrid更多的是使用addjavaScript function,拿最简单的第一种情况和第二种情况来看,我们就会发现,我们在创建一个线性布局的时候,3)产生的内存会比1)多,并且写入回收方法一样,会发现,当我们调用ondestory()回收function的时候,1)会很快速的回收掉,而3)却不一定,顾我们得出了如下结论,在使用不同的框架构造的时候,会对我们的内存产生也有很大的影响,顾我们在初期的时候一定要注意使用的框架架构,使用的什么混合性语言开发方式,如果不在开发的时候去约束内存,当我们开发测试阶段在约束控制内存就会发现异常的棘手

2.资源文件

从java转行做android的时候,就发现android的图片格式对应图片算法真的超级吓人,随便一张小小的图片,看着也就2,3kb,计算下来就很大,顾资源图片的大小,以及读取方式(这里指ps中图片保存读取位数以及图片清晰度等)会在很大程度的影响内存,尤其是在差在很多大公司提倡插件化,热更新之后,会在框架实现中以及,图片加载中,图片会被提前编译然后装载APK,会让图片的含KB量变得异常的吓人,如何控制呢,

1>观察,首先观察图片,看是否可以做成.9图,如果可以做成点九图,一定要做成点9图偶

2>图片压缩,不少ce会觉得图片的kb数量对内存影响不大,图片的大小才是影响内存的最大头

其实不然,在实际开发中,我们常常会发现,很多公司设计师在切图的时候,并不会对图片进行压缩,当我们拿着100kb的图片直接填充view的时候,更具计算我们会发现内存超级吓人,顾发生OOM也是很常见的事情了对不对。我们这个时候就要开发自己进行一个压缩图片,之前有同行问我.9图是否也可以压缩,经过本人的实验,.9图是可以进行适量的压缩,但是不能够压缩的太狠,否则会导致读取异常,一般读取异常的表现,就是把.9图当作普通图案读取,所以需要特别注意哈。

3>资源图片使用,我们一定要注意图片的复用,如果框类型相同,最好直接写xml shape 而不是用多张图片

3.单列【程序代码】

在我们实际开发的时候,还是会写很多的单列方法的,比如说我们常常使用的公用的判null方法,以及mask手机号,mask身份证等这样的方法类,单例 是一个全局的静态对象,当持有某个复制的类A是,A无法被释放,内存就会溢出,顾一定需要注意偶。

4.内部类【程序代码】【参考了http://www.cnblogs.com/deman/p/5860976.html】

java中的内部类(匿名内部类),会持有宿主类的强引用this。

所以如果是new Thread这种,后台线程的操作,当线程没有执行结束时,activity不会被回收。

Context的引用,当TextView 等等都会持有上下文的引用。如果有static drawable,就会导致该内存无法释放。

5.java data 产生内存

  之前在富民银行工作的时间,当时的PM上司,来自北京,就给妹子说,java data产生的内存可以不考虑,很少很少,但是经过本人的具体研究并不是如此,看了一些书,不仅发现了Shareperence存储值有限制,activity与activity之间传值也是有限制的,有兴趣的盆友,可以百度看看,有很多类似的文章,还是非常感谢那些技术盆友的分享,平时的我很少关注这些,也是才看到,发现真的如此,顾java data产生的内存也是很大的一块,不少的盆友喜欢用 okhttp相关框架,数据的解析方式真的在很大的一块会影响内存,for example

1》. 静态集合类引起内存泄露

主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。

我们在使用adb 提供的内存查看研究工具的时候也可以很明显看到有一行叫做java data ,顾在实际看法的时候一定要对json/xml等相关解析框架有一定的了解

6.项目编译apk中叠加了无用资源等引发的内存溢出

之前本人在开发成都银行手机app的时候,常常遇到在小手机上打开apk导致内存一出,我们使用开发工具es,as的时候,尤其是AS生成apk的时候会叠加很多无用class以及资源,这些都会因为功能等很大程度引发内存溢出,比如在我们打开手机银行app的时候我们需要热更新下载某些图片资源就会引发,这些在常见的有换肤请求APP中体现最明显,顾也很重要

上面就是小编的一些看法,没有图片较显枯燥,如果与小编有不同看法,可以发邮件至[email protected],一起交流技术,一起成长。

大家一起比较关心的图片动画等引起的内存问题将会在其他的文章中与大家一起探讨

时间: 2024-11-07 09:10:06

android内存泄露相关研究【整体看】的相关文章

android 内存泄露调试

一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) Bitmap对象不在使用时调用recycle()释放内存 4 (四) 释放对象的引用 4 (五) 其他 5 三.内存监测工具 DDMS --> Heap 5 四.内存分析工具 MAT(Memory Analyzer Tool) 7 (一) 生成.hprof文件 7 (二) 使用MAT导入.hpro

android内存泄露调试,Heap,MAT

三.内存监测工具 DDMS --> Heap 无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以真机为例,在模拟器中的情况类似).用Heap监测应用进程使用内存情况的步骤如下: 1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图.Heap视图都是打开的: 2. 将手机通过USB链接至电

Android内存泄露开篇

先来想这三个问题 内存泄露是怎么回事 内存会泄露的原因 避免内存泄露 1.内存泄露怎么回事 一个程序中,已经不需要使用某个对象,但是因为仍然有引用指向它垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露. Android的一个应用程序的内存泄露对别的应用程序影响不大. 为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进

Android内存泄露总结

Android可能发生内存泄露的地方总结: 1.查询数据库没有关闭游标 2.构建adapter时,没有使用缓存的convertView 3.Bitmap对象不使用的时候调用recycle()方法释放内存 4.释放对象的引用 5.单例模式引用context,如果使用actvitiy-context,会造成内存泄露, 可以使用getApplicationContext()); 或getApplication()代替. 参考文档: A?n?d?r?o?i?d? ?内?存?泄?漏?调?试 http://

避免Android内存泄露

摘自:http://blog.csdn.net/xyz_lmn/article/details/7108011 Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的(当然现在已经有几百兆的内存可以用了——译者注).它包括电话本身占用的和开发者可以使用的两部分.即使你没有占用全部内存的打算,你也应该尽量少的使用内存,以免别的应用在运行的时候关闭你的应用.Android能在内存中保持的应用越多,用户在切换应用的时候就越快.作为我的一项工作,我仔细研究了Androi

Android内存泄露案例分析

一款优秀的Android应用,不仅要有完善的功能,也要有良好的体验,而性能是影响体验的一个重要因素.内存泄露是Android开发中常见的性能问题.这篇文章,通过我们曾经遇到的一个真实的案例,来讲述一个内存泄露问题,从发现到分析定位,再到最终解决的全过程. 这里把整个过程分为四个阶段: 第一阶段,现场勘查,分析Bug现象,找出有用线索: 第二阶段,初步推断,根据之前的线索,推断可能导致Bug的原因,并且进一步验证推断是否正确: 第三阶段,探究根源,找出导致Bug的真正原因: 第四阶段,解决方案,研

android 内存泄露小计

1   今天在调试android 程序时候,发现即使程序退出了,发现还占用内存大概有15M.用MAT查看,经过多次GC操作,发现依旧是15.直觉告诉我,应该发生内存泄露了.然后利用MAT,查看Memory Leak.结果让我很吃惊,发现是InputMethodManager.这个对象一直引用着Context.也就是Activity,导致它无法释放内存.后来google 一下发现, 以下贴出解决办法,希望给遇到类似情况的人,提供帮助: @Override protected void onDest

深入Android内存泄露

深入内存泄露 Android应用的内存泄露,其实就是java虚拟机的堆内存泄漏. 1.知识储备 1.Java内存模型 相关内存对象模型,参照博客精讲Java内存模型 1) 寄存器(register).这是最快的保存区域,这是主要由于它位于处理器内部.然而,寄存器的数量十分有限,所以寄存器是需要由编译器分配的.我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹. (2) 堆栈(stack).在执行函数(方法)时,函数一些内部变量的存储都可以放在栈上面创建,函数执行结束的时候这

Android 内存泄露总结(附内存检测工具)

https://segmentfault.com/a/1190000006852540 主要是分三块: 静态储存区:编译时就分配好,在程序整个运行期间都存在.它主要存放静态数据和常量. 栈区:当方法执行时,会在栈区内存中创建方法体内部的局部变量,方法结束后自动释放内存. 堆区:通常存放 new 出来的对象.由 Java 垃圾回收器回收. 栈与堆的区别 栈内存用来存放局部变量和函数参数等.它是先进后出的队列,进出一一对应,不产生碎片,运行效率稳定高.当超过变量的作用域后,该变量也就无效了,分配给它