安卓的虚拟机是基于寄存器的Dalvik虚拟机,它的最大堆内存大小为16M,有的机器为24M,因此我们利用的内存空间是有限的。如果我们的内存占用超过一定的水平就会出现outofmemory的错误。
内存溢出的情况有如下几点:
1.释放资源问题
程序代码的问题,如果长期持有Context、Cursor、IO流的引用,资源得不到释放造成内存泄漏
2.内存对象过大的问题
保存多个耗用内存过大的对象如:Bitmap、XML文件,造成内存超出限制。
3.static关键字的使用问题
static是JAVA的关键字,当他用来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量他的生命周期很长,如果用他引用一些耗资源的实例就要谨慎使用。
public class Test { private static Context context;}
以上代码很危险,如果将Activity赋值到context的话,那么即使该Activity已经onDestroy,但由于对象保存它的引用,因此该Activity依然不会得到释放。
4.线程导致内存溢出
线程产生的内存泄漏主要原因在于线程周期的不可控。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MyTread.start();
}
private class <span style="font-family: Arial, Helvetica, sans-serif;">MyTread </span><span style="font-family: Arial, Helvetica, sans-serif;">extends Thread{</span>
@Override
public void run() {
super.run();
}
}
}
当我们横屏变竖屏是,如果没有设置config方法则会重新销毁Activity在创建一个新的,但是MyThread持有activity的引用,当MyThread的run函数没有结束的时候MyThread是不会被销毁的,因此activity也不会被销毁,就出现了内存泄漏问题。
解决办法:
将线程的内部类,改为静态内部类
在线程内部采用弱引用保存context的引用