java拥有垃圾回收机制(GC),而java中引用的对象具有如下四种引用类型,其各自的生存期存在一定的差异:
1、强引用
-
创建方法:
使用 new 创建一个新对象的方式即可创建一个强引用obj,代码如下:
Object obj = new Object(); -
生存期:
被强引用关联的对象通常不会被回收。
2、软引用
-
创建方法:
使用 SoftReference 类来创建软引用,代码示例如下:
SoftReference<Object> sr = new SoftReference<Object>(new Object()); -
生存期:
被软引用关联的对象只有在内存不够(即将发生OOM)的情况下才会被回收。
-
使用场景:
软引用通常用作缓存。
例如这里创建一个SoftReferenceCache,内部留个HashMap来缓存数据内容:
import java.lang.ref.SoftReference;
import java.util.HashMap;
/**
* SoftRefenceCache
* @param <K> key的类型.
* @param <V> value的类型.
*/
public class SoftReferenceCache<K, V> {
private final HashMap<K, SoftReference<V>> mCache;
public SoftReferenceCache() {
mCache = new HashMap<K, SoftReference<V>>();
}
/**
* 将对象放进缓存中,这个对象可以在GC发生时被回收
*
* @param key key的值.
* @param value value的值型.
*/
public void put(K key, V value) {
mCache.put(key, new SoftReference<V>(value));
}
/**
* 从缓存中获取value
*
* @param key
*
* @return 如果找到的话返回value,如果被回收或者压根儿没有就返* 回null
*/
public V get(K key) {
V value = null;
SoftReference<V> reference = mCache.get(key);
if (reference != null) {
value = reference.get();
}
return value;
}
}
使用方法如下:
SoftReferenceCache<Integer, Person> mPersonCache = new SoftReferenceCache<Integer, Person>();
mPersonCache.put(0, new Person("Peter");
mPersonCache.put(1, new Person("Jan");
mPersonCahce.put(2, new Person("Kees");
// 去拿Jan
Person p = (Person) mPersonCache.get(1);
3、弱引用
创建方法:
使用 WeakReference 类来创建弱引用,示例代码如下:
WeakReference<Object> wr = new WeakReference<Object>(new Object()); 生存期:
被弱引用关联的对象一定会被回收,也就是说它只能存活到下一次垃圾回收发生之前。
使用场景:
import java.lang.ref.WeakReference;
class Apple {
private String name;
public Apple(String name) {
this.name = name;
}
/**
* 覆盖finalize,在回收的时候会执行。
* @throws Throwable
*/
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("Apple: " + name + " finalize。");
}
@Override
public String toString() {
return "Apple{" + "name='" + name + "'}" + ", hashCode:" + this.hashCode();
}
}
public class Client {
public static void main(String[] args) {
WeakReference cache= new WeakReference<Apple>(new Apple("红富士"));
//通过WeakReference的get()方法获取Apple
System.out.println("Apple:" + cache.get());
System.gc();
try {
//休眠一下,在运行的时候加上虚拟机参数-XX:+PrintGCDetails,输出gc信息,确定gc发生了。
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//如果为空,代表被回收了
if (cache.get() == null) {
System.out.println("clear Apple。");
}
}
}
运行结果如下:
Apple:Apple{name='红富士'}, hashCode:1846274136
[GC (System.gc()) [PSYoungGen: 3328K->496K(38400K)] 3328K->504K(125952K), 0.0035102 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (System.gc()) [PSYoungGen: 496K->0K(38400K)] [ParOldGen: 8K->359K(87552K)] 504K->359K(125952K), [Metaspace: 2877K->2877K(1056768K)], 0.0067965 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Apple: 红富士 finalize。
clear Apple。 4、虚引用
创建方法:
使用 PhantomReference 来创建虚引用,示例代码如下:
PhantomReference<Object> pr = new PhantomReference<Object>(new Object(), null); 生存期:
给一个对象设置虚引用的唯一目的是:在这个对象被回收时收到一个系统通知。
使用场景:
可参考这篇文章内容:https://segmentfault.com/q/1010000004491370
至此完!
本文标题:Java编程里的四种引用类型及其生存期
本文链接:https://blog.quwenai.cn/post/8285.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。






还没有评论,来说两句吧...