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<A> softReference = new SoftReference<A>(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");
}
}
输出
WeakReference
public class Test {
public static void main(String[] args) throws Exception {
A a = new A();
a.name = "kutear";
WeakReference<A> weakReference = new WeakReference<A>(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");
}
}
输出