java弱引用代码 java 弱引用

java中弱引用是怎么回事?。?/h2>如果一个对象只具有弱引用,那就类似于可有可物的生活用品 。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期 。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存 。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象 。
弱引用可以和一个引用队列(ReferenceQueue)联合使用 , 如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中 。
当gc碰到弱可及对象,并释放abcWeakRef的引用 , 收集该对象 。但是gc可能需要对此运用才能找到该弱可及对象 。通过如下代码可以了明了的看出它的作用:
String abc=new String("abc");WeakReferenceString abcWeakRef = new WeakReferenceString(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 这类的程序时常会用到,因为这类程序需要取得某对象的信息 , 但是不可以 影响此对象的垃圾收集 。
Java中的强引用,软引用,弱引用 , 虚引用有什么用强引用:
只要引用存在,垃圾回收器永远不会回收
Object obj = new Object();
//可直接通过obj取得对应的对象 如obj.equels(new Object());
而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉 , 这也是我们经常所用到的编码形式 。
软引用:
非必须引用,内存溢出之前进行回收,可以通过以下代码实现
Object obj = new Object();
SoftReferenceObject sf = new SoftReferenceObject(obj);
obj = null;
sf.get();//有时候会返回null
这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;
软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据 , 提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据 。
弱引用:
第二次垃圾回收时回收 , 可以通过如下代码实现
Object obj = new Object();
WeakReferenceObject wf = new WeakReferenceObject(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾
弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时 , 将返回null 。
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记 。

推荐阅读