android 内存简介

提到内存,想必很多开发者都不陌生。以下简单介绍下android

内存


JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆、栈和方法区。
栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放。优点:速度快。
堆(heap):用于存放由new创建的对象和数组。在堆中分配的内存,一方面由java虚拟机自动垃圾回收器来管理,另一方面还需要程序员提供修养,防止内存泄露问题。
方法区(method):又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

Java GC

GC可以自动清理堆中不在使用(不在有对象持有该对象的引用)的对象。

在JAVA中对象如果再没有引用指向该对象,那么该对象就无从处理或调用该对象,这样的对象称为不可到达(unreachable)。垃圾回收用于释放不可到达的对象所占据的内存。

对android来说,内存使用尤为吃紧,最开始的app进程最大分配才8M的内存,渐渐增加到16M、32M、64M,但是和服务端相比还是很渺小的。如果对象回收不及时,很容易出现OOM错误。


内存溢出和泄漏

内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光

内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大。导致程序crash;


产生的原因


内存溢出产生的地方: 程序向系统申请的内存空间超出了系统能给的。内存泄露很容易引起OOM。

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

3.代码中存在死循环或循环产生过多重复的对象实体;

4.使用的第三方软件中的BUG;

5.启动参数内存值设定的过小

内存泄露主要表现的当Activity在finish的时候,由于对象持有对Activity的引用,造成Activity没有被及时回收。总结了下大致有5种情况造成内存泄露

1.static变量、匿名类的使用 

2.线程执行处理

3.各种监听回调处置

4.Bitmap等回收处置

5.集合类只有增操作却没有减操作。


分析工具

内存分析工具:MAT和LeackCanary。


MAT:Memory Analysis Tools 是一个分析 Java堆数据的专业工具,用它可以定位内存泄漏的原因,但是这个是Eclipse的一个插件,现在大多数人基本都用的是Androidstudio开发工具,所以不能直接使用,虽然不能直接使用但是还是可以用的,下文会讲到具体的使用方法。 
工具地址: https://www.eclipse.org/mat/

LeackCanary:是Square(square好像给我们弄了好多东西)专门为android弄的,检测泄露的工具;

工具地址:https://github.com/square/leakcanary 

中文翻译:http://www.jianshu.com/p/7db231163168







猜你喜欢

转载自blog.csdn.net/u010090644/article/details/80270271