都来看看Java中的“弱”;引用是什么?

  介绍

这篇文章将为大家详细讲解有关都来看看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中的“弱”;引用是什么?