Java弱引用,java弱引用和软引用

  Java弱引用,java弱引用和软引用

  java基础教程栏目介绍Java"弱" 引用

  如何解决写爬虫IP受阻的问题?立即使用。

  推荐(免费):java基础教程

  当Java中的对象obj被创建时,它被放在堆中。GC运行时发现没有对obj的引用,所以会回收obj对象的堆内存空间。

  换句话说,一个对象被回收, 必须满足两个条件:

  (1)没有引用它。

  (2)操作GC。

  在实际开发中,我们可以通过将对一个对象的所有引用设置为null来确保该对象在下次GC运行时被回收,如下所示:

  对象c=新车();

  c=空;但是,这样做是一件繁琐的事情,违背了GC自动恢复的原则。对于简单的情况,手动置空不需要程序员来做,因为在java中,对于简单的对象,当调用它的方法结束时,对它的引用会从堆栈中弹出,所以在下次GC执行时可以回收。

  然而,也有特殊的例外。在使用cache时,由于cache中的对象正是程序运行所需要的,所以只要程序在运行,cache中的引用就不会被GC收集(换句话说,cache中的引用与主程序具有相同的生命周期)。然后随着缓存中引用的数量越来越多,越来越多的对象无法被GC收集,所以无法自动收集。当这些对象需要回收时,回收这些对象的任务就留给了程序员。但是,这违背了GC(可回收对象的自动回收)的本质。

  因此,java中引入了弱引用。

  对象c=新车();//只要C还指向car对象,car对象就不会被回收——(强引用)当一个对象只被弱引用指向,没有其他强引用时,如果GC运行,那么这个对象就会被回收。

  这里有一个在线例子。首先,定义一个实体类:

  公共类汽车{

  私人双倍价格;

  私有字符串颜色;

  公共汽车(双倍价格,串色)

  {

  this.price=价格;

  this.color=color

  }

  public double getPrice()

  {

  退货价格;

  }

  公共字符串getColor()

  {

  返回颜色;

  }

  公共字符串toString()

  {

  “return”这辆车是“this.color”车,价格为$;

  }

  }一般在使用WeakReference时,定义一个类继承WeakReference,在这个类中定义了一些其他属性,所以这里不定义其他属性:

  公共类WeakReferenceCar扩展了WeakReferenceCar

  {

  公共武器参考车

  {

  超(车);

  }

  }调用}main函数,当然为了更清楚的看到GC的效果,设置虚拟机参数“-XX:printgdetails”:

  公共静态void main(String[] args)

  {

  车car=新车(2000.0,红色);

  WeakReferenceCar wrc=新WeakReferenceCar(汽车);

  WRC . setstr( 111 );

  int I=0;

  while(真)

  {

  if (wrc.get()!=空)

  {

  我;

  system . out . println( WeakReferenceCar的车为 I 而活,loop- WRC);

  }

  其他

  {

  system . out . println( WeakReferenceCar的车有bean收藏);

  打破;

  }

  }

  }最后是运行结果。

  WeakReferenceCar的车活了68450,循环采访。WeakReferenceCar@776ec8df

  WeakReferenceCar的车活了68451,循环采访。WeakReferenceCar@776ec8df

  WeakReferenceCar的车活了68452,循环采访。WeakReferenceCar@776ec8df

  WeakReferenceCar的车活了68453,循环采访。WeakReferenceCar@776ec8df

  [GC(分配失败)[PSYoungGen:34304k-1000k(38400k)]34320k-1016k(125952k),0.0015129秒] [Times: user=0.02 sys=0.02,real=0.00秒]

  WeakReferenceCar的车活了68454,循环采访。WeakReferenceCar@776ec8df

  WeakReferenceCar的车已经被收集了

  许多

  PSYoungGen总计38400K,已用1986K [0x00000000d5e00000,0x00000000da900000,0x0000000100000000

  伊甸园空间33280K,已用2%[0x 00000000 D5 e 00000,0x 0000000 D5 ef6b 70,0x 00000000 D7 e 80000]

  从空间5120K中,19%已使用[0x00000000d7e80000,0x 0000000 D7 f 7a 020,0x 00000000d 8380000]

  对于空间5120K,使用了0%[0x 00000000 da 400000,0x 0000000 da 4000000,0x 0000000 da 900000]

  ParOldGen total 87552K,已用16K[0x 0000000081 a 000000,0x0000000086f80000,0x 0000000 D5 e 00000]

  对象空间87552K,0%已用[0x0000000081a00000,0x 000000081 a 04000,0x 000000086 f 80000]

  元空间使用了3547K,容量4564K,提交了4864K,保留了1056768K

  使用的类空间381k,容量388k,提交的512k,保留的1048576k。可以看出,68454周期后,与WeakReferenceCar关联的对象car被回收。请注意,与弱引用关联的对象car被回收,而不是wrc本身。

  弱引用的一个特点是不确定何时回收,因为这是由GC操作的不确定性决定的。所以一般WeakReference引用的对象都是有价值的对象,是缓存的,容易重建的,消耗大量内存。

  弱引用指向的对象被回收后,弱引用本身其实是没用的。java提供了一个ReferenceQueue来存储其指向的对象已经被回收的引用。用法是在定义WeakReference时将ReferenceQueue对象作为参数传递给构造函数。以上都是为了看看Java里的‘弱’引用是什么?更多详情请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: