1-Android开发知识

Android 内存优化不完全手册

2018-08-30  本文已影响2人  贾亦真亦贾

我的技术博客:移动开发小水吧

什么是内存泄漏

只要是现代智能电子设备,不管或大或小,都会有一个叫做内存的硬件,在手机中这个硬件的参数尤为重要,是我们评价一个手机好坏的标准之一。

以Android手机为例,我们开发的程序如果想要运行起来,就需要开启一个独立的进程,而这个进程如果想要运行起来,就必须占用一部分的内存,这就是我们的应用和手机内存之间的关系了。
说到这里,我们就可以聊聊内存泄漏了(以下内容来自百度百科)。

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

内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。

百度百科的解释已经很明白了,具体到程序方面来说,基本上就是该回收的对象由于一些原因无法正常回收,这样的对象越来越多导致手机的内存占用率居高不下,可用的空闲内存越来越少,从而频繁的触发垃圾回收机制,以至于降低了应用的流畅度,严重的时候会导致内存溢出(OOM Out Of Memory)的问题,导致程序崩溃。

至于什么是内存溢出,请自行搜索学习,该知识点不在本篇教程内。

Java的四种引用

聊到Java的四种引用,其实也是一个知识点的加固,因为一些考虑到内存泄漏的解决方案中,需要用到这里的知识点,所以先讲解给大家:

具体用法可以自己查询一下,写几个例子,这里就不展开讲了。

常见内存泄漏

解决方案:

(1)我们可以选择使用软引用,从而在内存不足时,垃圾回收器更容易回收Bitmap垃圾。

private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new HashMap<String, SoftReference<Bitmap>>();

(2)Android2.3以后,SoftReference不再可靠。垃圾回收期更容易回收它,不再是内存不足时才回收软引用。那么缓存机制便失去了意义。

Google官方建议使用LruCache作为缓存的集合类。其实内部封装了LinkedHashMap。内部原理是一直判断集合大小是否超出给定的最大值,超出就把最早最少使用的对象踢出集合。

private LruCache<String, Bitmap> mMemoryCache = new LruCache<String, Bitmap>
((int)(Runtime.getRuntime().maxMemory()/8)){ 
//用最大内存的1/8分配给这个集合使用
//让这个集合知道每个图片的大小
@Override
protected int sizeOf(String key, Bitmap value){
int byteCount = value.getRowBytes() * value.getHeight();//计算图片大小,每行字节数*高度
return byteCount;
  }
}; 

内存泄漏总结

说了这么多,其实这些知识点很多朋友在其他技术文章中也都看到过了,我这里也只是做了归纳和总结,其中比较关键的就是在开发的过程中一定要心细,不要怕麻烦,对一些可能存在的内存泄漏一定要及时的处理,养成良好的编程习惯和责任心。

平时在开发的过程中,除了知道这些内存泄漏的知识点外还应当学习和利用一些工具来帮助自己分析应用的内存泄漏问题,这里我先推荐两个:一个是Android端的LeakCanary,还一个是AndroidStudio3.0出来的Profiler分析器,至于怎么用,大家可以自行查询相关文档学习,我这里就只是抛个砖。

谢谢你看完!

上一篇下一篇

猜你喜欢

热点阅读