Java中的WeakReference与SoftReference的用法


layout: post
title: Java中的WeakReference与SoftReference的用法
date: 2015-06-19
categories: blog
tags: [java,SoftReference,WeakReference]
category: Java
description: 本文介绍java中的引用,主要包括SoftReference,WeakReference,并说明使用场景


参考:

  • http://www2.sys-con.com/itsg/virtualcd/java/archives/0507/shields/index.html
  • http://www.ibm.com/developerworks/cn/java/j-lo-langref/
  • http://www.oschina.net/question/561356_109858
  • 书籍[Java编程思想] --17.12持有引用

概述
Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类。这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 Java 垃圾回收器对它们所指向的对象进行回收。其好处就在于使者可以保持对使用对象的引用,同时 JVM 依然可以在内存不够用的时候对使用对象进行回收。因此这个包在用来实现与缓存相关的应用时特别有用。同时该包也提供了在对象的“可达”性发生改变时,进行提醒的机制。本文通过对该包进行由浅入深的介绍与分析,使读者可以加深对该包的理解,从而更好地利用该包进行开发。
用法

  • SoftReference:通过该类引用后的对象仅在虚拟机的内存不足的时候才会被回收,多用于高速缓存.
  • WeakReference:该类不会妨碍GC对对象的正常回收.只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

实例
SoftReference

public class Test {
public static void main(String[] args) throws Exception {
    A a = new A();
    a.name = "kutear";
    SoftReference softReference = new SoftReference(a);
    a = null;
    System.out.println(weakReference.get().name);
    int i = 0;

    while (softReference.get() != null) {
        if (i == 10) {
            System.gc();
            System.out.println("GC");
        }
        Thread.sleep(1000);
        System.out.println(i);
        i++;
    }
    System.out.println("Finish");
}
}


class A {
    public String name;
    protected void finalize() throws Throwable {
        System.out.println("Finalize");
    }
 }

输出

QQ截图20150619001017.png

WeakReference

public class Test {
public static void main(String[] args) throws Exception {
    A a = new A();
    a.name = "kutear";
    WeakReference weakReference = new WeakReference(a);
    a = null;
    System.out.println(weakReference.get().name);
    int i = 0;

    while (weakReference.get() != null) {
        if (i == 10) {
            System.gc();
            System.out.println("GC");
        }
        Thread.sleep(1000);
        System.out.println(i);
        i++;
    }
    System.out.println("Finish");
}
}

 class A {
public String name;

protected void finalize() throws Throwable {
    System.out.println("Finalize");
}
 }

输出

QQ截图20150619001801.png

你可能感兴趣的:(Java中的WeakReference与SoftReference的用法)