java中弱引用是怎么回事啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中弱引用是怎么回事啊?相关的知识,希望对你有一定的参考价值。

如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
当gc碰到弱可及对象,并释放abcWeakRef的引用,收集该对象。但是gc可能需要对此运用才能找到该弱可及对象。通过如下代码可以了明了的看出它的作用:
String abc=new String("abc"); WeakReference<String> abcWeakRef = new WeakReference<String>(abc); abc=null; System.out.println("before gc: "+abcWeakRef.get()); System.gc(); System.out.println("after gc: "+abcWeakRef.get());

运行结果:
before gc: abc
after gc: null
gc收集弱可及对象的执行过程和软可及一样,只是gc不会根据内存情况来决定是不是收集该对象。
如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。
A obj = new A(); WeakReference wr = new WeakReference(obj); obj = null; //等待一段时间,obj对象就会被垃圾回收   ...   if (wr.get()==null)   System.out.println("obj 已经被清除了 ");    else   System.out.println("obj 尚未被清除,其信息是 "+obj.toString());      ... 在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果返回值为 null 的话,代表此对象已经被清除。
这类的技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。
参考技术A 弱引用就是聚合
强引用就是组合
聚合(Aggregation)是一种弱“拥有”关系,体现的是A对象可以包含或者说是拥有B对象,但是B对象不属于A对象的一部分,比如人可以拥有一个女朋友,但是这个女的不属于他这个人身体的一部分。同时聚合也不会随着对象A的创建而立马创建,而是当某外部因素导致了对象B的创建。(人和鼠标,人和电脑,人和猪,人和狗)
eg:
class Gril

class Boy
private Gril girl;
void getGril
gril=new Gril();


组合(Composition)是一种强的“拥有关系”,体现了严格的包含关系,部分和整体的关系,比如你有两只手,手和你组合关系,生命周期一样,我的理解他们生命周期的一样是人死了,手也相当于没了生命,而不是没了手,人就不能活。(人和脚,人和眼睛 and so on)
eg:
class Hand

class Man
private Hand hand;
Man()
hand=new Hand();

参考技术B 弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回 收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

以上是关于java中弱引用是怎么回事啊?的主要内容,如果未能解决你的问题,请参考以下文章

Python 中弱引用的神奇用法与原理探析

理解Java中的弱引用(Weak Reference)

(特别篇)java集合Map集合之WeakHashMap详解之弱引用详解

未能找到类型或命名空间名称SqlConnction(是缺少using指令或程序集引用?),是怎么回事啊?谁能解决?

phpcms,ucenter,uchome,discuz的api是怎么回事,怎么引用每个文件里的其他的方法、属性

Java弱引用(WeakReference)的理解与使用