这篇文章将为大家详细讲解有关都来看看Java中的“弱”;引用是什么?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
Java里一个对象obj被创建时,被放在堆里。当GC运行的时候,发现没有任何引用指向obj,那么就会回收obj对象的堆内存空间。
<强>换句话说,一个对象被回收,必须满足两个条件:强>
(1)没有任何引用指向它
(2) GC被运行。
在实际开发中,我们可以通过把所有指向某个对象的referece置空来保证这个对象在下次GC运行的时候被回收,类似下面:
Object c =, new 汽车(),,,,, c=零;
但是,这样做是一件很繁琐并且违背GC自动回收原则的事。对于简单的情况,手动置空是不需要程序员来做的,因为在java中,对于简单对象,当调用它的方法执行完毕后,指向它的引用会被从栈中弹出,所以它就能在下一次GC执行时被回收了。
但是,也有特殊例外。当使用缓存的时候,由于缓存的对象正是程序运行需要的,那么只要程序正在运行,缓存中的引用就不会被GC(或者说,缓存中参考的拥有了和主程序一样的生命周期)。那么随着缓存中参考的越来越多,GC无法回收的对象也越来越多,无法被自动回收。当这些对象需要被回收时,回收这些对象的任务只有交给程序编写者了。然而这却违背了GC的本质(自动回收可以回收的对象)。
所以,java中引入了弱引用。
Object c =, new 汽车();,//只要c还指向car 对象,,car 对象就不会被回收,——祝辞(强引用)
当一个对象仅仅被弱引用指向,而没有任何其他强引用指向的时候,如果GC运行,那么这个对象就会被回收。
下面这个是网上的例子,首先定义一个实体类:
public class car { ,,,private double ,,,,价格; ,,,private String ,,,颜色; ,,,public 汽车(double 价格,String 颜色) ,,,{ ,,,,,,,this.price =,价格; ,,,,,,,this.color =,颜色; ,,,} ,,,public double getPrice () ,,,{ ,,,,,,,return 价格; ,,,} ,,,public String 色鬼() ,,,{ ,,,,,,,return 颜色; ,,,} ,,,public String toString () ,,,{ ,,,,,,,return “却;能够car is a “, +, this.color +,,,,, costs “美元,+,价格; ,,,} }
一般使用WeakReference引用的时候都会定义一个类继承自WeakReference引用,在这个类中再定义一些别的属性,这里就不定义别的属性了:
public class WeakReferenceCar extends WeakReference{ ,,,public WeakReferenceCar (Car 汽车) ,,,{ ,,,,,,,超级(车); ,,,} }
主要函数调用一下,当然为了更清楚地看到GC的效果,设置虚拟机参数“- xx: + PrintGCDetails”:
public static void main (String [], args) { ,,,Car Car =, new 汽车(2000.0,,“red"); ,,,WeakReferenceCar wrc =, new WeakReferenceCar(车); ,,,wrc.setStr (“111”); ,,,int 小姐:=,0; ,,,while (真正的) ,,,{ ,,,,,,,if (wrc.get (), !=, null) ,,,,,,,{ ,,,,,,,,,,,我+ +; ,,,,,,,,,,,System.out.println (“WeakReferenceCar& # 39; s Car is alive for “, +,小姐:+,,,,loop 作用;“,+,人们受; ,,,,,,,} ,,,,,,, ,,,,,,,{ ,,,,,,,,,,,System.out.println (“WeakReferenceCar& # 39; s Car has bean collected"); ,,,,,,,,,,,休息; ,,,,,,,} ,,,} }
最后是运行结果
WeakReferenceCar& # 39; s Car is alive for 68450年,loop 作用;interview.WeakReferenceCar@776ec8df WeakReferenceCar& # 39; s  Car is  alive for 68451年,loop 作用;interview.WeakReferenceCar@776ec8df WeakReferenceCar& # 39; s  Car is  alive for 68452年,loop 作用;interview.WeakReferenceCar@776ec8df WeakReferenceCar& # 39; s  Car is  alive for 68453年,loop 作用;interview.WeakReferenceCar@776ec8df [GC (Allocation 失败),[PSYoungGen:, 34304 k, 1000 k (38400 k)], 34320 k→1016 k (125952 k),,, 0.0015129秒],[*:用户=0.02,sys=0.02,,真正的=0.00,秒), null null null null null null null null null null null都来看看Java中的“弱”;引用是什么?