本文将深入地介绍关于引用对象(Reference Objects)的知识。基本上说,引用对象提供了一种对象间接引用所需内存的方式,这些引用对象保存在一个引用对象中(类ReferenceQuene),它监视这些引用对象使得其可以访问。基于这种类型的引用对象,垃圾回收器能够释放内存,而一般的对象引用则可能无法释放。
在Java中,有四种类型的对象引用。常用的是直接引用,如:
Object obj = new Object()
您可以将直接引用当作一种无需额外的代码去创建或访问对象的一种强引用。接下来的三种类型的引用是java.lang.ref包中的Reference类的子类。软引用(Soft reference)由SoftReference类提供,弱引用(weak reference)由WeakReference类提供,幻像引用(PhantomReference)由PhantomReference提供。
软引用的工作方式很像数据缓存。当系统内存太低的时候,GC可以任意地释放软引用所引用的对象。换句话说,如果一个对象没有强引用,那么这个对象就是一个候选释放对象。在抛出OutOfMemoryException异常之前,GC将要求释放任何软引用。
弱引用比软引用弱。如果对象的引用只有弱引用,则GC将可能在任何时候回收内存,而不需要等到内存不足的时候。典型的动作是GC在下一个回收周期中对象的内存被回收。
幻像引用与清理任务有关。他们提供了一种在GC执行终止程序和释放对象之前即时通知机制。将其理解为在一个对象之前进行的清理任务。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/bio_go/archive/2009/05/11/4165106.aspx
import java.util.Map;
import java.util.WeakHashMap;
public class WeakTest
{
private static Map<String, String> map;
public static void main(String args[])
{
map = new WeakHashMap<String, String>();
String str = new String("Peter");
map.put(str, "Peter");
Thread t = new Thread(new Runnable()
{
public void run()
{
while(map.containsKey("Peter"))
{
try
{
Thread.sleep(500);
}
catch(InterruptedException ignored) {
// Do nothing
}
System.out.println("The map contains Peter.");
System.gc();
}
System.out.println("Peter has gone.");
}
});
t.start();
try
{
Thread.sleep(2000);
// After two seconds, we set str null
str = null;
System.out.println("Main thread is going to join our thread");
t.join();
}
catch(InterruptedException ignored)
{
}
}
}