Java弱引用
时间:2010-06-15 来源:hkebao
Java弱引用
时间:2010-6-15
之前一直没有接触过弱引用这个概念,今天看到以后觉得挺新鲜,就查了查资料总结一下,希望对大家有所帮助。
要理解弱引用,首先要先了解一下强引用(Strong Reference), 其实我之前也并不了解强引用,虽然天天都在用。举例来说:
- String abc = new String ("abcdf");
这 就是创建了一个String的实例然后在变量abc中保存一个强引用,为什么说它强(Strong)呢?这是跟垃圾回收器相关的,如果一个对象是通过强引 用链(Chain of Strong Reference) 访问到的,也就是像上面那样,那么这个对象是不会被垃圾回收器回收的, 这在正常情况下是正确的,因为你不想垃圾回收器回收你正在使用的对象。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemory错误,是程序异常 终止,也不会为了解决内存不足而回收这类引用的对象。这就是使用强引用的一个问题, 强引用的另外一个常见的问题就是缓存, 特别是对于那些非常大的数据结构,像图片等等,平差情况下我们是希望程序能缓存这些大的数据结构的,因为重新加载非常耗费服务器资源。因为缓存就是为了避 免重新加载这些大的数据结构的,所以缓存中会保存一个指向内存中数据结构的引用,而这些引用通常都是强引用,所以这些引用会强迫这些大的数据结构保存在内 存中,除非用通过某些方法户知道哪一个数据结构不再需要保存在内存中了,然后再把他从缓存中清除。
笔记:
1、当JVM发现内存不足的时候它宁愿抛出一个异常OutOfMemory也不会轻易回收有被引用的对象。
2、强引用还可以应用于缓存。比如有些大的内存对象每加载一次需要耗费很大的服务器资源的。所以可以考虑将其缓存起来
弱引用就是不保证不被垃圾回收器回收的对象,它拥有比较短暂的生命周期,在垃圾回收器扫描它所管辖的内存区域过程中,一旦发现了只具有弱引用的对象,就会回收它的内存,不过一般情况下,垃圾回收器的线程优先级很低,也就不会很快发现那些只有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用的对象被垃圾回收的话,Java虚拟机就会把这个弱引用加入相关的引用队列中。
一下就是创建弱引用对象的例子。
public static void main(String[] args) {
String abc = new String("abcde");
WeakReference<String> wf = new WeakReference<String>(abc);
String abc1 = wf.get();
System.out.println(abc1);
System.out.println(abc == abc1);
System.out.println(abc.equals(abc1));
}
说明:以上就是创建了一个弱引用。如果JVM还没有将其回收的话就全部返回true了。