Android 的虚拟机是基于寄存器的 Dalvik,它的最大堆大小一般是 16M。但是 Android
采用的是 Java 语言编写,所以在很大程度上,Android 的内存机制等同于 Java 的内存机
制,在刚开始开发的时候,内存的限制问题会给我们带来内存溢出等严重问题。在我们不使
用一些内存的时候,我们要尽量在 Android 或者其他平台上避免在运行其他程序时,保存
必要的状态,使得一些死进程所带来的内存问题,应该尽量在关闭程序或者保存状态的时候
释放掉,这样能提高系统在运行方面的流畅性。
Android 的内存主要表现在:
1. 在 Android 平台上,长期保持一些资源的引用,造成一些内存不能释放,带来的内存泄
露问题很多。比如:Context(下文中提到的 Activity 都是 Context),在一些你需要保持
你的首个类对象状态,并且把状态传入其他类对象中时,这样消除掉首个类对象之前,你必
须先把接收类对象释放掉。需要注意一点的是:因为在 Java 或者 Android 内存机制中,
顶点的结点释放前必须保证其他对象没有调用才能被系统 GC 回收释放。我们来看一段代码:
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextViewlabel = new TextView(this);
label.setText("Leaksare bad");
setContentView(label);
}
这个代码的意思就是我们把一个 TextView 的实例加载到了我们正在运行的 Activity
(Context)当中,因此,通过 GC 回收机制,我们知道,要释放 Context,就必须先释放
掉引用他的一些对象。如果没有,那在要释放 Context 的时候,你会发现会有大量的内存
溢出。所以在你不小心的情况下内存溢出是一件非常容易的事情。 保存一些对象时,同时
也会造成内存泄露。最简单的比如说位图(Bitmap),比如说:在屏幕旋转时,会破坏当前
保持的一个 Activity 状态,并且重新申请生成新的 Activity,直到新的 Activity 状态被保
存。我们再看一段代码:
privatestatic Drawable sBackground;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");
if (sBackground == null) {
sBackground =getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);
setContentView(label);
}