做者:不洗碗工做室fhyPayasojava
版权归做者全部,转载请注明出处android
先看一个例子 : 数组
Person person;
person = new Person("name");复制代码
上面两行代码中,第一行person属于声明了一个Person类的引用,而第二行的new才是真正建立了一个对象。bash
Java在JVM所虚拟的内存环境中运行,内存能够分为三个部分:栈,堆,方法区ide
栈(stack) 每个线程都拥有一个栈,在这里只保存基本数据类型和对象的引用(注意和对象的区别),例如在方法中定义一个局部变量,就会在栈中给这个变量分配内存空间,超过该变量的做用域时,这部份内存就会被回收掉。性能
堆(heap) 被全部进程所共享,只存放数组、对象以及对象的成员变量,不包括基本类型和引用,这部份内存空间由java中的垃圾回收机制自动管理。优化
方法区(method) 又叫静态区,一样被全部进程所共享,存放class和static变量。ui
举个例子:this
public class Person {
int age = 18;
Person personA = new Person();
public void method() {
int height = 180;
Person personB = new Person();
}
}
Person personC = new Person();复制代码
在上面的例子中,height以及引用变量personB都属于局部变量,因此它们的内存应存放在栈中,在method方法以外的做用域,这部份内存就会被回收,而personB所指向的对象的内存存放在堆上。 引用变量personC所指向的对象同理也存放在堆上,固然也包括Person类的成员变量age和personA,但引用变量personC自己则是存放在栈中。spa
在Java中,内存的分配是由程序来完成的,而内存的回收则是由GC完成的,GC为了能正确的释放对象,必须监控每个对象的运行状态,包括对象的申请、引用、赋值等。对象经过引用的方式来使用,而当一个对象没有任何引用的时候,称为不可到达对象,GC用于回收不可到达对象所占用的内存。
虽然java中有垃圾回收的机制,能够自动管理内存分配,可是仍有可能出现内存泄露的状况。Java做为Android的主要开发语言,当存在内存泄漏时,APP就会浪费大量内存,当内存不够时会致使频繁的内存回收,然而内存回收是十分耗时的操做,这样就会致使APP的卡顿,严重的可能会致使内存溢出,退出程序。
内存泄露的缘由 安卓中主要出现内存泄漏的缘由本质上就是,一个对象已经不会再被使用,但其内存却没有被系统所回收,而没法被回收的缘由通常是因为该对象被一个生命周期更长的对象所引用。
常见的内存泄漏
static关键字所致使的内存泄露
举个例子:
public class MainActivity extends Activity{
private static Context context;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R,layout.main);
context = this;
}
}复制代码
context为静态变量,生命周期较长,致使当前activity被销毁后没法被系统回收,产生内存泄漏。
解决办法:在Activity的onDestroy方法里把静态变量设为null
protected void onDestroy() {
super.onDestroy();
if(context != null) {
context = null;
}
}复制代码
本文先初步探究android中的内存泄露的基本原理,其余具体可能引发内存泄露的情景和解决方法会在后续文章中探讨。
参考文章: 《Android 中内存泄漏的缘由和解决方案》http://m.blog.csdn.net/lib739449500/article/details/78741263 《Android常见内存泄露,学会这六招大大优化APP性能》https://www.douban.com/note/609777758/