Java引用类结构如下所示:


强引用:就算出现OOM也不对该对象进行回收,不进行GC。
/**
* @author luffy
**/
public class ReferenceDemo {
public static void main(String[] args){
Object obj1 = new Object();
Object obj2 = obj1;
obj1 = null;
System.gc();
System.out.println(obj2);
}
}
软引用:系统内存充足时不会被回收,反正则会被回收。
/**
* @author luffy
**/
public class ReferenceDemo {
public static void main(String[] args){
Object obj1 = new Object();
SoftReference<Object> softReference = new SoftReference<>(obj1);
System.out.println(obj1);
System.out.println(softReference.get());
obj1 = null;
//-Xms5m -Xmx5m
try {
Byte[] bytes = new Byte[10*1024*1024];
}finally {
System.out.println(obj1);
System.out.println(softReference.get());
}
}
}
弱引用:只要垃圾回收机制一运行,不管JVM内存空间是否足够,都会回收该对象占用的内存。
/**
* @author luffy
**/
public class ReferenceDemo {
public static void main(String[] args){
Object obj1 = new Object();
WeakReference<Object> weakReference = new WeakReference<>(obj1);
System.out.println(obj1);
System.out.println(weakReference.get());
obj1 = null;
System.gc();
System.out.println(obj1);
System.out.println(weakReference.get());
}
}
软引用,弱引用:适用缓存。

WeakHashMap示例代码如下:
/**
* @author luffy
**/
public class ReferenceDemo {
public static void main(String[] args){
WeakHashMap<Integer,String> weakHashMap = new WeakHashMap<>();
//Integer key = 2;
Integer key = new Integer(2);
String value = "luffy";
weakHashMap.put(key,value);
System.out.println(weakHashMap);
key = null;
System.out.println(weakHashMap);
System.gc();
System.out.println(weakHashMap);
}
}
虚引用:如果一个对象仅持有虚引用,无任何引用,虚引用的get方法总是返回null,任何时候都可能被GC,GC时被放入引用队列。
/**
* @author luffy
**/
public class ReferenceDemo {
public static void main(String[] args){
Object obj1 = new Object();
//通知机制
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference<>(obj1,referenceQueue);
System.out.println(obj1);
System.out.println(phantomReference.get()); //总返回null
System.out.println(referenceQueue.poll());
obj1 = null;
System.gc();
System.out.println("======================================");
System.out.println(obj1);
System.out.println(phantomReference.get()); //总返回null
System.out.println(referenceQueue.poll());
}
}
网友评论