GC是垃圾收集的意思(GabageCollection)。和JAVA一样,Android系统也是由GC来自动回收内存的。android中一个应用的启动,android系统都会为这个应用分配一个dalivk虚拟机,以便这个应用运行在这个独立的虚拟机上,可是一个虚拟机内存大小一般也是限制的(20M左右)。可见,一个应用的运行所申请的内存不可能无限大的。
那我们做android开发时候,就需要特别注意内存的引用,比如一个占用内存大的对象、以及一个bitmap对象,他们往往无用、又占用大量内存资源而GC又没有办法去释放,从而造成严重后果。一般的原则是:对占用大量内存的变量,使用完后主动将其置为NULL,可能的话主动调用一次GC:system.gc(),特别是一些static型的引用风险很大。
强引用 SrongReference
一般我们常用到的引用就是强引用,例如 new String();
软引用 SoftReference
对于GC来说,SoftReference的强度明显低于SrongReference。SoftReference修饰的引用,其告诉GC:我是一个软引用,当内存不足的时候,我指向的这个内存是可以给你释放掉的。我们来看一下android系统中的一个使用实列(MessageItem.java)
private SoftReference<Bitmap> mBitmapCache = new SoftReference<Bitmap>(null);
public Bitmap getIpMessageBitmap() {
return mBitmapCache.get();
}
public void setIpMessageBitmapCache(Bitmap bitmap) {
if (null != bitmap) {
mBitmapCache = new SoftReference<Bitmap>(bitmap);
}
}
弱引用WeakReference
对于GC来说,WeakReference的强度又明显低于SoftReference。WeakReference修饰的引用,其告诉GC:我是一个弱引用,对于你的要求我没有话说,我指向的这个内存是可以给你释放掉的。我们来看一下android系统中的一个使用实列(InstalledAppDetails.java 这是一段停用一个APP的代码段,其中这个需要停用APP的InstalledAppDetails对象 在这里的引用就采用了弱引用)
final PackageManager mPm;
final WeakReference<InstalledAppDetails> mActivity;
final ApplicationInfo mInfo;
final int mState;
DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
mPm = activity.mPm;
mActivity = new WeakReference<InstalledAppDetails>(activity);
mInfo = info;
mState = state;
}
虚引用PhantomReference
虚引用其实和上面讲到的各种引用不是一回事的,他主要是为跟踪一个对象何时被GC回收
补充
LruCache是android提供的缓存工具类。
它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。