优质广告供应商

广告是为了更好地支持作者创作

Java中四种引用类型

强引用

强引用是使用最普遍的引用:Object o=new Object();
特点:不会被GC
将对象的引用显示地置为null:o=null; 帮助垃圾收集器回收此对象
例如ArrayList的clear()方法的源代码:

public void clear() {
        modCount++;
        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;
        size = 0;
    }

软引用

用来描述一些还有用但是并非必须的对象,在Java中用java.lang.ref.SoftReference类来表示;对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

User user=new User();
SoftReference softReference=new SoftReference(user);
User user1= (User) softReference.get();

刚才说道当内存不足的时候user会被回收,softReference.get()会返回null,但是softReference本身也是一个强引用,避免太多softReference导致内存泄漏,软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中;从名字可以看出它是一个队列,我们可以通过这个队列来把这些失去所软引用的对象的SoftReference对象清除掉

//联合使用
ReferenceQueue queue = new ReferenceQueue();
User user=new User();
SoftReference softReference=new SoftReference(user,queue);
User user1= (User) softReference.get();

//清除的方式
SoftReference ref = null;
while ((ref = (EmployeeRef) q.poll()) != null) {
// 清除ref
}

弱引用

弱引用和软引用的区别在于,弱引用的生命周期很短,在垃圾回收器扫描它管辖的内存区域的过程中,一旦发现弱引用对象马上会被回收;不过因为垃圾回收器的线程很低,所以不一定马上就发现那些只具有弱引用的对象

虚引用

一个对象是都有虚引用的存在都不会对生存时间都构成影响,也无法通过虚引用来获取对一个对象的真实引用。唯一的用处:能在对象被GC时收到系统通知,JAVA中用PhantomReference来实现虚引用。

LruCache

可以利用软引用、弱引用来实现缓存;但是在Android已经提供了一种缓存策略,LruCache;

LRU(Least Recently Used)缓存算法,是近期最少使用算法,它的核心思想是当缓存满的时候,会优先淘汰那些近期最少使用的缓存对象。采用LRU算法的缓存有两种:LrhCache和DisLruCache,分别用于实现内存缓存和硬盘缓存,其核心思想都是LRU缓存算法。

使用

//图片缓存
    private LruCache<String, Bitmap> mImageCache;
    private void initImageCache() {
        //计算可使用的最大内存,进程能够拿到的最大内存
        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        //取四分之一作为缓存
        int cacheSize = maxMemory / 4;
        mImageCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            //重写sizeOf方法,计算出要缓存的每张图片的大小
            protected int sizeOf(String key, Bitmap bitmap) {
                //Bitmap所占用的内存空间数等于Bitmap的每一行所占用的空间数乘以Bitmap的行数
                return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
            }
        };
    }
    mImageCache.put(url, bitmap);
    Bitmap bitmap = mImageCache.get(url);

实现原理

LruCache是个泛型类,把对象储存在LinkedHashMap中;LruCache维护一个缓存对象列表,对象列表的排列方式是按照访问顺序实现的,最近访问的对象放在队尾,没被访问的对象自然被挤到队头,队头的对象最容易被挤掉,被淘汰

参考文章:

优质广告供应商

广告是为了更好地支持作者创作

推荐阅读更多精彩内容

  • 对象的强、软、弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也...
    极客大白阅读 795评论 0 1
  • Java GarbageCollection(GC) Java不能像C/C++那样直接对内存进行操作(内存分配和垃...
    狮_子歌歌阅读 2,156评论 0 3
  • 优质广告供应商

    广告是为了更好地支持作者创作

  • Java/Android中有四种引用类型,分别是: Strong reference - 强引用 Soft R...
    天空下天的月亮阅读 409评论 1 0
  • 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由 高到低依...
    Speronie阅读 158评论 0 0
  • 自去自来堂上燕,相亲相近手中鸥。 -杜甫 青春是迷茫的,无知的, 不羁的,娇纵的,无悔的 我们一起起肆意的放纵,...
    此间少年_733c阅读 184评论 0 0
  • 能量世界50天, 在这个负能量聚增的环境里,人们在无止境追求外在的美,导致内心有偏差,区分心。通过这个事件产生的如...
    史德波阅读 76评论 0 0
  • 优质广告供应商

    广告是为了更好地支持作者创作

  • 向日葵的日子是单调乏味的,可它却比人更懂得生活。尽管得整日整夜地扎根在土壤无法拥有人这般行动自如的双脚,可是只要有...
    小小念棠叫妮妮阅读 261评论 0 0